您的位置:首页 > 其它

NOIP200504循环

2016-05-22 20:58 344 查看
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。

显而易见,高精度乘法。来几次幂就行了。

#include<iostream>
using namespace std;
char s[200];
int k,ans[110];
void x(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 a[110],b[110],c[110],d[110],i,j,num,n,p;
int main()
{
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++) d[i]=a[i];
ans[0]=1;
for(i=0;i<k;i++)
{
for(j=0;j<=i;j++) b[j]=d[j];
p=b[i];
num=0;
do
{
x(a,b,i+1,c,i+1);
num++;
for(n=0;n<k;n++) b
=c
;
} while((num<10)&&(b[i]!=p));
if(b[i]!=p)
{
cout<<-1<<endl;
return 0;
}
for(j=0;j<k;j++) b[j]=a[j];
for(j=0;j<num-1;j++)
{
x(a,b,k,c,k);
for(n=0;n<110;n++) a
=c
;
}
x(ans,&num,1,c,110);
for(n=0;n<110;n++) ans
=c
;
}
for(i=110-1;ans[i]==0;i--);
for(;i>=0;i--) cout<<ans[i];
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: