1764 - 循环
<span><span>乐乐是一个聪明而又勤奋好学的孩子。他总喜欢探求事物的规律。一天,他突然对数的正整数次幂产生了兴趣。</span></span><span><span><span><span><br />
众所周知,2的正整数次幂最后一位数总是不断的在重复2,4,8,6,2,4,8,6……我们说2的正整数次幂最后一位的循环长度是4(实际上4的倍数都可以说是循环长度,但我们只考虑最小的循环长度)。类似的,其余的数字的正整数次幂最后一位数也有类似的循环现象:
<br />
<span><span>循环</span></span><span><span><span><span><br />
循环长度
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位都相同。
<br />
<br />
Input
<span><span>输入文件</span><span><span><span>circle.in</span></span></span></span><span><span>只有一行,包含两个整数</span><span><span><span>n</span></span></span></span><span><span>(</span><span><span><span>1 <= n < 10100</span></span></span></span><span><span>)和</span><span><span><span>k</span></span></span></span><span><span>(</span><span><span><span>1 <= k <= 100</span></span></span></span><span><span>),</span><span><span><span>n</span></span></span></span><span><span>和</span><span><span><span>k</span></span></span></span><span><span>之间用一个空格隔开,表示要求</span><span><span><span>n</span></span></span></span><span><span>的正整数次幂的最后</span><span><span><span>k</span></span></span></span><span><span>位的循环长度。</span></span><span><span><span><span><br />
<br />
Output
<span><span>输出文件</span><span><span><span>circle.out</span></span></span></span><span><span>包括一行,这一行只包含一个整数,表示循环长度。如果循环不存在,输出</span><span><span><span>-1</span></span></span></span><span><span>。</span></span><span><span><span><span><br />
<br />
Examples
Input
32 2
Output
4
Hint
<span><span>对于</span><span><span><span>30%</span></span></span></span><span><span>的数据,</span><span><span><span>k <= 4</span></span></span></span><span><span>;</span></span><span><span><span><span><br />
对于全部的数据,k <= 100。<br />
Solution C++
#include<cstdlib> #include<iostream> #include<cstdlib> #include<cstring> #include<string> #define LEN 110 using namespace std; char s[200]; int k; int result[LEN] ; void M2AA(int a[], int b[], int b1, int c[],int c1) { int i,j; for(i=0;i<c1;i++) c[i]=0; if (b1 > c1) b1 = c1; for(i=0; i<b1; i++) { if (b[i]) { for(j=0; j<c1-i; j++) { c[i+j] = a[j]*b[i] + c[i+j]; c[i+j+1]= c[i+j+1] + c[j+i]/10; c[i+j] = c[i+j]%10; } } } } int main() { int a[LEN],b[LEN],c[LEN],aa[LEN]; int i,j,tp,num,n; cin>>s>>k; n=strlen(s); for(i=0;i<n;i++) a[n-i-1] = s[i] - '0'; for (i=0; i<k; i++) aa[i] = a[i]; result[0]=1; for(i=0; i<k; i++) { for(j=0;j<=i;j++) b[j]=aa[j]; tp=b[i]; num=0; do { M2AA(a, b, i+1, c, i+1); num++; for(n=0; n<k; n++) b[n]=c[n]; } while ((num<10) && (b[i]!=tp)); if(b[i]!=tp) { cout<<-1<<endl; return 0; } for(j=0;j<k;j++) b[j] = a[j]; for(j=0;j<num-1;j++) { M2AA(a, b, k, c, k); for(n=0;n<LEN;n++) a[n]=c[n]; } M2AA(result, &num,1, c, LEN); for(n=0; n<LEN; n++) result[n]=c[n]; } for (i=LEN-1; result[i]==0; i--); for( ; i>=0 ; i--) cout<<result[i]; return 0; }
Hint
<span><span>对于</span><span><span><span>30%</span></span></span></span><span><span>的数据,</span><span><span><span>k <= 4</span></span></span></span><span><span>;</span></span><span><span><span><span><br />
对于全部的数据,k <= 100。
<br />