NOIP2005普及组第四题

来源:互联网 发布:大闸蟹 二恶英 知乎 编辑:程序博客网 时间:2024/05/20 17:09

题目描述

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

众所周知,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位都相同。

输入输出格式

输入格式:
输入文件circle.in只有一行,包含两个整数n(1 <= n < 10^100)和k(1 <= k <= 100),n和k之间用一个空格隔开,表示要求n的正整数次幂的最后k位的循环长度。

输出格式:
输出文件circle.out包括一行,这一行只包含一个整数,表示循环长度。如果循环不存在,输出-1。

输入输出样例

输入样例#1:
32 2
输出样例#1:
4
说明

对于30%的数据,k <= 4;

对于全部的数据,k <= 100。

NOIP2005普及组第四题

30分,取后4位数。

//如何去判断是否时候循环节?数组存储? #include<iostream>#include<cstdio>#include<cmath>using namespace std;int n,k,q;int a[10000000];//int quick(int x,int m)//快速幂到多大? //{//  int tmp=x,ans=1;//  while(m)//  {//      if(m&1)//      {//          ans=ans*tmp % q;        //      }//      tmp*=tmp; //      m>>=1;//  }//  return ans;//}int main(){    scanf("%d%d",&n,&k);    k=pow(10,k);//  a[1]=n%k;//  a[2]=a[1]* (n%k) %k;//  a[3]=a[2]* (n%k) %k;//  a[4]=a[3]* (n%k) %k;     int p=n%k;    a[0]=1;    for(int i=1;i<=1000000;i++)    {        a[i]=a[i-1]*p %k;//最多就是四位数*四位数         //kmp?判断循环节?        //当后两位相同时,下一个数也是*p%k,因此也相同,以此类推,找出循环节。         if(i>1 && a[i]==a[1]){            cout<<i-1<<endl;            return 0;        }    }     cout<<-1<<endl;    return 0;}
原创粉丝点击