NOIP200504循环
乐乐是一个聪明而又勤奋好学的孩子。他总喜欢探求事物的规律。一天,他突然对数的正整数次幂产生了兴趣。众所周知,2的正整数次幂最后一位数总是不断的在重复2,4,8,6,2,4,8,6……我们说2的正整数次幂最后一位的循环长度是4(实际上4的倍数都可以说是循环长度,但我们只考虑最小的循环长度)。类似的,其余的数字的正整数次幂最后一位数也有类似的循环现象:
循环现象 循环 循环长度
2 2、4、8、6 4
3 3、9、7、1 4
4 4、6 2
5 5 1
6 6 1
7 7、9、3、1 4
8 8、4、2、6 4
9 9、1 2
这时乐乐的问题就出来了:是不是只有最后一位才有这样的循环呢?对于一个整数n的正整数次幂来说,它的后k位是否会发生循环?如果循环的话,循环长度是多少呢?
注意:
1.如果n的某个正整数次幂的位数不足k,那么不足的高位看做是0。
2.如果循环长度是L,那么说明对于任意的正整数a,n的a次幂和a+L次幂的最后k位都相同。
输入 |
只有一行,包含两个整数n和k,n和k之间用一个空格隔开,表示要求n的正整数次幂的最后k位的循环长度。 |
输出 |
包括一行,这一行只包含一个整数,表示循环长度。如果循环不存在,输出-1。 |
输入示例 |
32 2 |
输出示例 |
4 |
其他说明 |
数据范围:1<=k<=100,1<=n<10^100。 |
显而易见,高精度乘法。来几次幂就行了。
1 #include<iostream> 2 using namespace std; 3 char s[200]; 4 int k,ans[110]; 5 void x(int a[],int b[],int b1,int c[],int c1) 6 { 7 int i,j; 8 for(i=0;i<c1;i++) c[i]=0; 9 if(b1>c1) b1=c1; 10 for(i=0;i<b1;i++) 11 { 12 if(b[i]) 13 for(j=0;j<c1-i;j++) 14 { 15 c[i+j]=a[j]*b[i]+c[i+j]; 16 c[i+j+1]=c[i+j+1]+c[j+i]/10; 17 c[i+j]=c[i+j]%10; 18 } 19 } 20 } 21 int a[110],b[110],c[110],d[110],i,j,num,n,p; 22 int main() 23 { 24 cin>>s>>k; 25 n=strlen(s); 26 for(i=0;i<n;i++) a[n-i-1]=s[i]-‘0‘; 27 for(i=0;i<k;i++) d[i]=a[i]; 28 ans[0]=1; 29 for(i=0;i<k;i++) 30 { 31 for(j=0;j<=i;j++) b[j]=d[j]; 32 p=b[i]; 33 num=0; 34 do 35 { 36 x(a,b,i+1,c,i+1); 37 num++; 38 for(n=0;n<k;n++) b[n]=c[n]; 39 } while((num<10)&&(b[i]!=p)); 40 if(b[i]!=p) 41 { 42 cout<<-1<<endl; 43 return 0; 44 } 45 for(j=0;j<k;j++) b[j]=a[j]; 46 for(j=0;j<num-1;j++) 47 { 48 x(a,b,k,c,k); 49 for(n=0;n<110;n++) a[n]=c[n]; 50 } 51 x(ans,&num,1,c,110); 52 for(n=0;n<110;n++) ans[n]=c[n]; 53 } 54 for(i=110-1;ans[i]==0;i--); 55 for(;i>=0;i--) cout<<ans[i]; 56 }
时间: 2024-10-28 05:40:13