1764 - 循环

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 128 MB


<span><span>乐乐是一个聪明而又勤奋好学的孩子。他总喜欢探求事物的规律。一天,他突然对数的正整数次幂产生了兴趣。</span></span><span><span><span><span><br />


众所周知,2的正整数次幂最后一位数总是不断的在重复24862486……我们说2的正整数次幂最后一位的循环长度是4(实际上4的倍数都可以说是循环长度,但我们只考虑最小的循环长度)。类似的,其余的数字的正整数次幂最后一位数也有类似的循环现象:

<br />

<span><span>循环</span></span><span><span><span><span><br />

循环长度

2
2
486
4

3
3
971
4

4
4
6
2

5
5
1

6
6
1

7
7
931
4

8
8
426
4

9
9
1
2


这时乐乐的问题就出来了:是不是只有最后一位才有这样的循环呢?对于一个整数n的正整数次幂来说,它的后k位是否会发生循环?如果循环的话,循环长度是多少呢?

注意:

1
. 如果n的某个正整数次幂的位数不足k,那么不足的高位看做是0

2
. 如果循环长度是L,那么说明对于任意的正整数ana次幂和a + L次幂的最后k位都相同。

<br />

<br />

题目输入


<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 &lt;= n &lt; 10100</span></span></span></span><span><span>)和</span><span><span><span>k</span></span></span></span><span><span>(</span><span><span><span>1 &lt;= k &lt;= 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 />

题目输出


<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 />

输入/输出样例

输入格式

32 2

输出格式

4

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;

 }