题目问是x经过k次变换得到的值是多少。每次变换x只能变为不小于原先值的一个值,而且第i次变换的时候变换后的x必须能整除i,要求是最小值。
如果x能整除就不变,不能整除就把i-余数加上就能整除i。
设x%i=j,那么x=i*j,如果x在第i次变换前的值是y=x-j的话,那么y=j*(i-1),就像斐波那契数列一样,y=x,得到的新的x必定是y+j,所以以后的就不用计算,一个剪枝。接下来就是暴力枚举了。
#include<stdio.h>
#include<string.h>
int main()
{
__int64 x,k,i;
int cas=1;
while(scanf("%I64d %I64d",&x,&k),x+k)
{
__int64 p,q;
for(i=2;i<=k;i++)
{
__int64 y=x;
if(x%i!=0)
{
if(i>x)
x=i;
else
x+=(i-x%i);
}
p=x-y;
q=x/i;
if(p==q)//推导出来的一个剪枝
break;
}
if(i<k)
x+=(k-i)*p;
printf("Case #%d: %I64d\n",cas++,x);
}
return 0;
}