您的位置:首页 > 其它

NOIP2005普及组第四题

2017-06-13 21:21 134 查看
题目描述

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

众所周知,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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: