题解:P13635 [NWRRC 2021] Halfway There
注意到 \(2\le n\le10^{18}\),所以暴力枚举肯定不行。
注意到一个性质,\(\gcd(n,m)=\gcd(n,n-m)\)(\(n\ge m\))。
- 证明
如果有 \(d \mid n\),\(d \mid m\),那么设 \(n=x\times d\),\(m=y\times d\),\(n-m=(x-y)\times d\),即 \(d\mid (n-m)\),所以 \(\gcd(n,m)=\gcd(n,n-m)\)(\(n\ge m\))。
容易发现,\(m\) 和 \(n-m\) 关于 \(\frac{n}{2}\) 对称。
所以总的答案数应该 \(\le\frac{n}{2}\),因此我们只需要从 \(\frac{n}{2}\) 往下枚举,如果枚举到的数和 \(n\) 互质,就输出即可,注意需要开long long,同时手写的递归实现gcd会超时,可以使用库函数。
#include<bits/stdc++.h>
using namespace std;
long long t,n,tmp;
int main(){
cin>>t;
while(t--){
cin>>n;
tmp=n>>1;
while(__gcd(tmp,n)!=1){
tmp--;
}
cout<<tmp<<endl;
}
return 0;
}

浙公网安备 33010602011771号