这题做得真心纠结,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;
}