K尾相等数
时间限制:
3000 ms | 内存限制:
65535 KB
难度:
1
-
描述
-
输入一个自然数K(K>1),如果存在自然数M和N(M>N),使得K^M和K^N均大于等于1000,且他们的末尾三位数相等,则称M和N是一对“K尾相等数”。下面请编程求出M+N最小的K尾相等数。
-
输入
-
第一行包含一个正整数T,T<10000,表示有T组数据;
随后有N行,每行包括一个整数K(K<2*10^10);
输出
- 对于输入的每个整数K,输出对应的M+N的最小值; 样例输入
-
1 2
样例输出
-
120
-
-
/*分析:刚看到这题目 以为3秒好下手,于是超时超时超时,接着wawa 原先思路是初始m=1,判断k大于等于1000时m的值 然后n=m+1;接着不断乘以公差直到与之相等,后来超时 错误在于m的选取错 刚大于1000不一定是要求的 ,并且可能不存在与m时相等 所以应该定义一个数组记录m-n所有的k值 优化一下 这里简单的优化就是利用m-n是递增的 用a[?]记录 k的?次方mod1000的值 用book记录是否出现过 若出现过即扫描m-n 然后求出m 就可以了
-
*/
-
//ac代码
-
#include <cstdio> #include <cstring> using namespace std; int main(){ bool book[1000]; int a[10000]; int t,i,n,m; long long k,hehe; scanf("%d",&t); while(t--){ memset(book,0,sizeof(book)); scanf("%lld",&k); hehe=k; m=1; while(k<1000){ k*=hehe; m++; } n=m+1; k%=1000; a[m]=k; while(book[k]!=1){ book[k]=1; k*=hehe; k%=1000; a[n]=k; n++; } for(i=m;i<n;i++){ if(a[i]==k) break; } printf("%d\n",n+i-1); } return 0; }
-
第一行包含一个正整数T,T<10000,表示有T组数据;