NOIP200504循环

                                              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 }
View Code
原文地址:https://www.cnblogs.com/wxjor/p/5517758.html