大概意思是求最小x使得2^x%n==1.
时间限制(普通/Java):1000MS/3000MS 运行内存限制:65536KByte
代码
#include<stdio.h>
int main()
{
int x,a,n;
while(scanf("%d",&n)!=EOF)
{
if((n%2==0)||(n==1))
printf("?\n");
else
{
x=1;a=2%n;
while(a%n!=1)
{
a=a*2%n;
x++;
}
printf("%d\n",x);
}
}
return 0;
}
总结:因为这是比赛的第一题,所以我觉得应该特别简单,抬抬手就能a的。。但是并不是!!!!!尼玛今天下午的题弄得我天都黑了!!!其实后来做出来之后发现并不是辣么难。。。下面就来写解题报告。
取余有个性质(a*b)%c=(a%c*b%c)%c;这里是2^x%c,那么式中的a,b都是2。
既然有了这个性质,2^x%n=(2%n*2%n*2%n*2%n*2%n....(x个))%n。
循环就好写了。定义一个a=2%n,x=1;如果a%n==1,输出此时x。如果a%n!=1,a=a*2%n,x++;继续循环。。。总有那么个时候a%n==1就不满足循环条件跳出循环,然后输出x,这题目就这么完了。。。
很巧妙的一个过程。能a很开心!