这题做得真心纠结,RE两次才ac。思路是每次相乘后都取余,以余数为索引将指数存到数组中,若余数相同的存在,则直接返回当前指数与对应数组元素的和。经典题。
附ac代码:
#include <stdio.h> #include <string.h> int sign[1001]; //索引 int f(long long k){ memset(sign, 0, sizeof(sign)); long long t; int i = 1, j; t = k; while(k < 1000){ k *= t; ++i; } sign[k %= 1000] = i++; for(j = 1; j <= 1001; ++j, ++i) if(sign[k = (k * t) % 1000]) return i + sign[k]; else sign[k] = i; } int main(){ int t; long long k; scanf("%d", &t); while(t-- && scanf("%lld", &k)) printf("%d\n", f(k)); return 0; }
原文:http://blog.csdn.net/chang_mu/article/details/19213309