题目链接:http://acm.uestc.edu.cn/problem.php?pid=1639
TAG:数学
题目大意:一个数【1-10000】如果是5的倍数,要+M,如果每一位都相同 要+N,同时满足同时加。加完还满足就继续加,求最后得到的数的最大值,最大值无限输出INF
【1<=N M<=50】
首先,如果M不是5的倍数,可以枚举最开始的数,每个数最多+2次就停了。
然后如果M是10的倍数,肯定是INF,【只要开始选10000,就能无限加】
如果M,N都是5的倍数,肯定INF。【随便选个5的倍数就能不停加】
那么剩下的数怎么办呢?
可以发现,如果一个数加到了55555……5555的时候,就会停下来,因为下一次就要+M+N了。。
所以我们对于M=5,15,25,35,45的时候,进行判断。
可以发现 最开始选10000-M 和选 10000的效果是一样的,
所以我们把最开始的数从10000-M+5 枚举到 10000
然后枚举终止的数 55555……55555
终止的数不超过LONG LONG
判断 (终止的数-最开始的数)%M 是不是等于0
如果是 结果就是 终止数+M+N
如果一直找不到这样一个终止数 答案就是INF
【感觉有点没说清楚额。。】
代码
/*******************************************************************************************
* user_id = 135678942570 run_id = 291179
******************************************************************************************/
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
bool check1(long long int x)
{
return x%5==0;
}
bool check2(long long int x)
{
int temp=x%10;
x/=10;
while(x)
{
if((x%10)!=temp)
return 0;
x/=10;
}
return 1;
}
int next_i(int x)
{
if(x%10==9)
{
x/=9;
x*=10;
x++;
return x;
}
int t=x%10;
x/=(t);
x*=(t+1);
return x;
}
main()
{
// freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
int t,cas=0;
for(scanf("%d",&t);t;t--)
{
long long int res2=0;
long long int res1=0;
printf("Case #%d: ",++cas);
int m,n;
scanf("%d%d",&m,&n);
if((m%5==0&&n%5==0)||(m%10==0))
{
puts("INF");
continue;
}
if(m%5==0)
{
if(m==5)
printf("%d\n",55555+n+m);
else
{
long long int ans=0;
long long maxint=1;
for(int j=0;j<62;j++)
maxint*=2;
if(m==35)
{
int st;
st=0;
}
for(int i=10000-m+5;i<=10000;i+=5)
{
for(long long int j=55555;j<maxint;j=j*10+5)
{
if((j-i)%m==0)
{
ans=max(j+n+m,(long long )ans);
goto loop;
}
}
puts("INF");
goto stop;
loop:;
}
printf("%lld\n",ans);
}
continue;
}
for(int i=1;i<=9999;i=next_i(i))
{
long long int now=i;
while(1)
{
long long int sum=0;
if(check1(now))
sum+=m;
if(check2(now))
sum+=n;
if(sum==0)
break;
now+=sum;
}
res1=max(now,res1);
}
for(int i=5;i<=10000;i+=5)
{
long long int now2=i;
while(1)
{
long long int sum=0;
if(check1(now2))
sum+=m;
if(check2(now2))
sum+=n;
if(sum==0)
break;
now2+=sum;
}
res2=max(now2,res2);
}
printf("%lld\n",max(res1,res2));
stop:;
}
return 0;
}