原题链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2313
题意:N个女孩站成一个圆圈,互相扔球。拿着球的第一个女孩把它扔给她左边的 第K个 女孩(1 <= K <= N / 2)。那个女孩接球,然后把它扔给她左边的第K个女孩,依此类推。直到它回到第一个女孩。并且每个女孩必须在比赛期间拿到球,求最大的K是多少。
思路:这里的n数据很大——102000,看到这个数据首先就想到了打表找规律。若要每个人都传到球,那么要 __gcd(i,n) == 1
,i 为1~n/2的数。
然后打表会发现,奇数时,最大 k 为 n/2
,偶数时又分(n/2)%2 == 0
是否成立,若满足则 k 为(n/2-2)
,否则就是(n/2-1)
,再套个大数板子就可以了。
这里是伪代码,关于大数可以看这个万能板子:戳我
int main(){
int T;
cin >> T;
while(T--){
BigInteger n; //按整型来操作即可
cin>>n;
if(n % 2 == 1){
cout<<n/2<<endl;
}
else {
if((n/2)%2 == 1){
cout<<(n/2-2)<<endl;
}
else cout<<(n/2-1)<<endl;
}
if(T != 0) puts("");
}
}