题目链接:

http://poj.org/problem?id=3899

题目意思:

求给定区间内,只含4、7的数的个数以及通过反转后在该区间内的个数和。

解题思路:

模拟+数学。

代码解释的很详细,请看代码。

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<list>
#include<queue>
#define eps 1e-6
#define INF 0x1f1f1f1f
#define PI acos(-1.0)
#define ll __int64
#define lson l,m,(rt<<1)
#define rson m+1,r,(rt<<1)|1
using namespace std; /*
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
*/
char A[50],B[50];
//g1(a,b,len) 表示1-a中后缀为b的lucky数,其中len是b的长度
//g2(a,b)表示1-a中反转后大于b的lucky数
//A-B 之间的lucky数个数为 g1(B,0,0)-g1(A-1,0,0)
//反转后在A-B 之间的lucky数为 g2(A,A)-g2(A,B)+g2(B,B)-g2(A,B) ll g1(char * a,char * b,int len)
{
int alen=strlen(a);
ll res=0;
bool ism=false; for(int i=0;i<len;i++) //比较a的后len位与b的大小,>=
{
int j=i+alen-len;
if(a[j]>b[i])
break;
else if(a[j]<b[i])
{
ism=true;
break;
}
}
if(len==0) //先算出低于alen位的总的lucky数
{
for(int i=1;i<alen;i++)
res+=(ll)1<<i; //i位的话一共有2^i个lucky数
}//如果len!=0 那么前面的m位中也有1-m,这种情况好像没考虑啊
int m=alen-len; //计算与a位数相同lucky数
int i;
for(i=0;i<m;i++) //一位一位从前往后考虑
{
if(a[i]>'7') //4和7都可以
{
res+=(ll)1<<(m-i);
break;
}
else if(a[i]=='7') //4一定可以,7再往后计算
res+=(ll)1<<(m-i-1);//把是4的情况计算清楚,后面就是7的情况
else if(a[i]>'4'&&a[i]<'7')
{
res+=(ll)1<<(m-i-1); //放4的情况,后面可以任意
break;
}
else if(a[i]<'4')
break;
}
if((i==m)&&!ism) //计算临界情况
res++;
return res;
} ll g2(char * a,char * b) //1-a之间,反转后大于b的lucky数
{ //b的长度肯定要>=a的长度
int alen=strlen(a);
char tmp[50],*last=&tmp[49]; //从后往前
ll res=0; for(int i=0;i<alen;i++)
{
if(b[i]>'7') //高位已经超过7了,不可能超过它了
break ;
else if(b[i]=='7') //边界情况
*(last--)='7';
else if(b[i]>'4'&&b[i]<'7') //只要满足这
{
*last='7'; //只要把后面的这一位置成7,前面的可以任意了
res+=g1(a,last,i+1);
break;
}
else if(b[i]=='4')
{
*last='7';
res+=g1(a,last,i+1); //把这位放7,前面的就任意了
*(last--)='4'; //然后把它放4作为临界情况
}
else
{
*last='7'; //后面放7,前面就任意了
res+=g1(a,last,i+1);
*last='4'; //后面放4,前面就任意了
res+=g1(a,last,i+1);
break;
}
}
//因为是算大于的情况,临界情况就不用考虑了
return res;
} int main()
{
int t; char aa[4]="999",bb[2]="7";
printf("%I64d\n",g1(aa,bb,1)); scanf("%d",&t);
while(t--)
{
scanf("%s%s",A,B);
int lea=strlen(A),leb=strlen(B); if(A[lea-1]!='0')
--A[lea-1]; //是零的话就无所谓了
ll ans=0;
ans+=(g1(B,NULL,0)-g1(A,NULL,0)+g2(A,A)+g2(B,B));
if(lea==leb)
ans-=(2*g2(A,B));
printf("%I64d\n",ans); }
return 0;
}

poj-3899-The Lucky Numbers 模拟+数学的更多相关文章

  1. HDU 5676 ztr loves lucky numbers (模拟)

    ztr loves lucky numbers 题目链接: http://acm.hust.edu.cn/vjudge/contest/121332#problem/I Description ztr ...

  2. codeforces 630C Lucky Numbers

    C. Lucky Numbers time limit per test 0.5 seconds memory limit per test 64 megabytes input standard i ...

  3. hdu 5676 ztr loves lucky numbers(dfs+离线)

    Problem Description ztr loves lucky numbers. Everybody knows that positive integers are lucky if the ...

  4. codeforces 630C - Lucky Numbers 递推思路

    630C - Lucky Numbers 题目大意: 给定数字位数,且这个数字只能由7和8组成,问有多少种组合的可能性 思路: 假设为1位,只有7和8:两位的时候,除了77,78,87,88之外还哇哦 ...

  5. hdu 5676 ztr loves lucky numbers 打表+二分

    ztr loves lucky numbers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/ ...

  6. ZCMU 2177 Lucky Numbers (easy)

    传送门: http://acm.zcmu.edu.cn/JudgeOnline/problem.php?id=2177 2177: Lucky Numbers (easy) 时间限制: 2 Sec   ...

  7. hdu-5676 ztr loves lucky numbers(乱搞题)

    题目链接: ztr loves lucky numbers  Time Limit: 2000/1000 MS (Java/Others)  Memory Limit: 65536/65536 K ( ...

  8. C - Lucky Numbers (easy)

    Problem description Petya loves lucky numbers. Everybody knows that positive integers are lucky if t ...

  9. Codeforces Round #160 (Div. 2)---A. Roma and Lucky Numbers

    Roma and Lucky Numbers time limit per test 1 second memory limit per test 256 megabytes input standa ...

随机推荐

  1. 在Livemedia的基础上开发自己的流媒体客户端

    一.背景 二.Livemedia框架介绍 1.总体框架 2.客户端框架 2.1 客户端openRTSP流程 2.2增加一种新的媒体 2.2.1增加媒体的format 2.2.2 新媒体需要考虑的问题 ...

  2. HDU 1848 Fibonacci again and again

    题解:尼姆博弈,对于1至1000计算SG函数,每次取最小的前继值,SG值异或为0则为P-position. #include <cstdio> #include <cstring&g ...

  3. HDU 1787 GCD Again

    题目大意:求小于n的gcd(i,n)大于1的个数: 题解:欧拉函数直接求gcd(i,n)==1的个数  用n减即可 #include <cstdio> int eular(int n){ ...

  4. Html.ActionLink(转载)

    @Html.ActionLink 代码: <h2>HtmlHelper</h2>@Html.ActionLink("默认","Index" ...

  5. JSPatch技术文档

    一.背景需求介绍 为什么我们需要一个热修复(hot-fix)技术? 工作中容易犯错.bug难以避免. 开发和测试人力有限. 苹果Appstore审核周期太长,一旦出现严重bug难以快速上线新版本. 作 ...

  6. java异常回顾

    String getMessage():返回此Throwable的详细消息字符串 void PrintStackTrace():将throw及其追踪输出至标准错误流 void printStackTr ...

  7. jz2440不能成功地启动文件系统, Failed to execute /linuxrc.

    文件系统加载失败,错误信息提示:    VFS: Mounted root (nfs filesystem).    Freeing init memory: 140K    Failed to ex ...

  8. BZOJ 2748 音量调节

           这道题我开始做时想用搜索来做,但是失败了,后来仔细一想发现这就是一个背包问题,之后一切就简单多了.        代码如下: #include<cstdio> #includ ...

  9. 面向对象程序设计-C++ Stream & Template & Exception【第十五次上课笔记】

    这是本门<面向对象程序设计>课最后一次上课,刚好上完了这本<Thinking in C++> :) 这节课首先讲了流 Stream 的概念 平时我们主要用的是(1)在屏幕上输入 ...

  10. BaseAdapter导致notifyDataSetChanged()无效的四个原因及处理方法

    前一段时间在做一个项目的时候遇到了一个关于BaseAdapter的notifyDataSetChanged()方法无效问题,当时在网上搜了一个解决方法,今天又遇到了一个类似的问题,我在这里做个记录,防 ...