poj 3899 The Lucky Numbers
来源:互联网 发布:unity3d 上海 外包 编辑:程序博客网 时间:2024/06/05 03:01
http://poj.org/problem?id=3899
思路:
1. 可以总结出n位数的lucky numbers有2^n个
2. 求[A,B]间的lucky numbers个数,如果A和B位数相同,则求f(A,B),否则造出一个数C=99…9,位数和A相同,一个数D=11…1,位数和B相同,求f(A,C)+f(B,D)+2^i(i为大于A的位数小于B的位数的所有整数)
现在就转化为求子问题f(A,B),A和B位数相同。
1. [A,B]间的lucky number包括三部分组成,一部分是小于A的(4),一部分是大于B的(3),还有就是介于A、B间的(2)
2. 可以比较容易求出与x位数相同但小于x的lucky number数g(x),则AB间的lucky number数目为g(B+1)-g(A),实现只要注意是否包括A\B
3. 可以比较容易求出与x位数相同本身大于B但逆序后小于x的lucky number数h(x,B),则逆序后在[A,B]间但大于B的数为h(B,B)-h(A,B)
4. 可以比较容易求出与x位数相同本身小于A但逆序后大于x的lucky number数r(x,A),则逆序后在[A,B]间但小于A的数为r(A,A)-r(B,A)
这样问题就解决了。
见:http://poj.org/problemstatus?problem_id=3899
几个函数:
__int64 g(char s[],bool flag) //2,flag true包括该数,否则不包括
{
__int64 res = 0;
int n = strlen(s);
int i;
for(i = 0;i < n;i ++)
{
if(s[i] < '4')
return res;
if(s[i] > '7'){
res += tab[n-i];
return res;
}
if(s[i] > '4'&&s[i] < '7'){
res += tab[n-i-1];
return res;
}
if(s[i] == '7')
res += tab[n-i-1];
}
if(flag && i == n)
res ++;
return res;
}
//s为x,s2为B,flag同上
__int64 h(char s[],char s2[],bool flag)
{
__int64 res = 0;
int n = strlen(s);
char str[50];
strcpy(str,s);
int i;
for(i = 0;i < n;i ++)
{
if(s[i] < '4')
return res;
if(s[i] > '7'){
str[i] = '4';
res += get(s2,i+1,str);
str[i] = '7';
res += get(s2,i+1,str);
return res;
}
if(s[i] > '4'&&s[i] < '7'){
str[i] = '4';
res += get(s2,i+1,str);
return res;
}
if(s[i] == '7'){
str[i] = '4';
res += get(s2,i+1,str);
str[i] = s[i];
}
}
if(flag){
for(i = 0;i < n;i ++){
if(s[n-1-i]>s2[i]){
res ++;
break;
}
else if(s[n-1-i]<s2[i])
break;
}
}
return res;
}
//s为x,s2为A,flag同上
__int64 r(char s[],char s2[],bool flag)
{
__int64 res = 0;
int n = strlen(s);
char str[50];
strcpy(str,s);
int i;
for(i = 0;i < n;i ++)
{
if(s[i] < '4'){
str[i] = '4';
res += getd(s2,i+1,str);
str[i] = '7';
res += getd(s2,i+1,str);
return res;
}
if(s[i] > '7'){
return res;
}
if(s[i] > '4'&&s[i] < '7'){
str[i] = '7';
res += getd(s2,i+1,str);
return res;
}
if(s[i] == '4'){
str[i] = '7';
res += getd(s2,i+1,str);
str[i] = s[i];
}
}
if(flag){
for(i = 0;i < n;i ++){
if(s[n-1-i]<s2[i]){
res ++;
break;
}
else if(s[n-1-i]>s2[i])
break;
}
}
return res;
}
- poj 3899 The Lucky Numbers
- poj-3899-The Lucky Numbers 模拟+数学
- poj 3909 --Lucky numbers(搜索)
- 3933:The Almost Lucky Numbers
- POJ 3909 Lucky numbers 深搜预存+二分
- poj3899 The Lucky Numbers 模拟+数学
- Lucky Numbers
- Lucky Numbers
- Lucky Numbers
- 【*】POJ-3899(数论很难)(Lucky Numbers——统计)
- Codeforces 288E Polo the Penguin and Lucky Numbers
- [bnu] 4104 Lucky numbers
- hust1600 Lucky Numbers 小水题
- F: Lucky Numbers
- UVa11970 - Lucky Numbers
- HUST 1600 Lucky Numbers
- C - Lucky Numbers
- HUST 1600 Lucky Numbers
- 情感词生成 [opinion mining]
- CSS 中background-img 的相关属性
- POJ 3821 Clickomania
- POJ 3842 排列问题
- C#爬取动态网页
- poj 3899 The Lucky Numbers
- poj解题报告整理
- poj 3847 树(链接表与堆栈的实现)
- poj 3865 数据库冗余问题判断
- 利用Stanford Parser进行中文行为抽取
- C++及Java连接MySQL方法
- HIT LTP的使用及利用句法关系简单抽取示例
- Java中Object的使用:重载equals、hashCode及实现compareTo
- 文件流fstream处理多个文件