做题感悟:这题其实很简单,只是尝试了很久。
解题思路:这题就是取模的思想,一定要注意输出 - 1 的情况,循环必须与第一个次取模得的结果一样,否则如果出现循环不是与第一个产生的循环则输出 - 1 。
代码:
#include<stdio.h> #include<string.h> #include<math.h> bool vis[100005] ; int main() { long long int T,n,k,sum ; scanf("%lld",&T) ; while(T--) { scanf("%lld%lld",&n,&k) ; memset(vis,false,sizeof(vis)) ; sum=pow(10,k) ; long long mx=1,num=1,mod,nx=-1,flag ; flag=n%sum ; while(1) { mx*=n ; mod=mx%sum ; mx=mx%sum ; if(mod==flag&&vis[mod]) // 如果是与第一个相同则记录 nx=num-1 ; if(vis[mod]) // 出现循环则结束 break ; vis[mod]=num ; num++ ; } printf("%lld\n",nx) ; } return 0 ; }