Loading

题解: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;
}
posted @ 2026-08-01 19:53  heffo_hard  阅读(13)  评论(0)    收藏  举报