循环
Problem 2 : 循环
(circle.pas/circle.in/circle.out)
【问题描述】
乐乐是一个聪明而又勤奋好学的孩子。他总喜欢探求事物的规律。一天,他突然对数的正整数次幂产生了兴趣。
众所周知,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 < 10100)和k(1 <= k <= 100),n和k之间用一个空格隔开,表示要求n的正整数次幂的最后k位的循环长度。
【输出文件】
输出文件circle.out包括一行,这一行只包含一个整数,表示循环长度。如果循环不存在,输出-1。
【样例输入】
32 2
【样例输出】
4
【数据规模】
对于30%的数据,k <= 4;
对于全部的数据,k <= 100
我的想法
只与最后k位有关,对n先取模,然后模拟.30分
正解:
从最后一位开始,求出满足最后一个的乘几个n,设为x个,然后再乘x个n,2x个n,直到满足倒数最后第二个数,乘1~9,如果都没出现,那么-1.
我的程序(未AC)
#include<iostream> #include<cmath> using namespace std; void in(long long &x) { long long y=1; char c=getchar();x=0; while(c>'9'||c<'0') { if(c=='-') y=-1; c=getchar(); } while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar(); x*=y; } void out(long long x) { if(x<0) { putchar('-'); x=-x; } if(x>9)out(x/10); putchar(x%10+'0'); } long long n,k,t,l; long long Pow(long long x,long long y) { long long t=1; for(long long i=1;i<=y;i++) t*=x; return t; } int main() { freopen("circle.in","r",stdin); freopen("circle.out","w",stdout); in(n),in(k); if(n<0) { cout<<"-1"<<endl; return 0; } n%=Pow(10,k); t=n; while(1) { l++; t*=n; t%=Pow(10,k); if(t==n) { out(l); break; } if(l>1000000) { cout<<"-1"<<endl; break; } } return 0; }