首页 > 代码库 > hdu4952 Number Transformation(数学题 | 找规律)

hdu4952 Number Transformation(数学题 | 找规律)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4952


Number Transformation

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 261    Accepted Submission(s): 117


Problem Description
Teacher Mai has an integer x.

He does the following operations k times. In the i-th operation, x becomes the least integer no less than x, which is the multiple of i.

He wants to know what is the number x now.
 
Input
There are multiple test cases, terminated by a line "0 0".

For each test case, the only one line contains two integers x,k(1<=x<=10^10, 1<=k<=10^10).
 
Output
For each test case, output one line "Case #k: x", where k is the case number counting from 1.
 
Sample Input
2520 10 2520 20 0 0
 
Sample Output
Case #1: 2520 Case #2: 2600
 
Source
2014 Multi-University Training Contest 8 



官方题解:http://blog.sina.com.cn/u/1809706204

打表找规律也行!

当时在打表的时候10W是WA,20W是T,最后12W才过!

代码如下:
#include<cstdio>
typedef __int64 LL;
int main()
{
    int cas=1;
    LL i;
    LL x,k;
    while(scanf("%I64d %I64d",&x,&k)!=EOF)
    {
        if(x==0 && k==0)
            break;
        if(k <= 120000)
        {
            for(i = 1; i <= k; i++)
            {
                if(x%i==0)
                    continue;
                else
                    x=(x/i+1)*i;
            }
            printf("Case #%d: ",cas++);
            printf("%I64d\n",x);
        }
        else
        {
            LL y1,y2;
            for(i = 1; i <= 120000; i++)
            {
                if(x%i==0)
                    continue;
                else
                    x=(x/i+1)*i;
            }
            y1=x;
            y2=(x/i+1)*i;
            printf("Case #%d: ",cas++);
            printf("%I64d\n",y1+(k-120000)*(y2-y1));
        }
    }
    return 0;
}