专栏文章

题解:P13635 [NWRRC 2021] Halfway There

P13635题解参与者 2已保存评论 2

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
2 条
当前快照
1 份
快照标识符
@minnpl3n
此快照首次捕获于
2025/12/02 05:23
3 个月前
此快照最后确认于
2025/12/02 05:23
3 个月前
查看原文
我和楼上的方法差不多,但我优化了一些特殊情况。

题意

求小于 nn 的所有与 nn 互质的数集合中的中位数。

分析

1. nn 为奇数。

  • 由于 nn 是奇数,所以 (n1)÷2(n-1)\div2nn 互质。
  • 证明:设 (n1)÷2(n-1)\div2kk
    gcd(n,k)=gcd(2×k+1,k)=gcd(k,1)=1\gcd(n,k)=\gcd(2\times k+1,k)=\gcd(k,1)=1
    所以 (n1)÷2(n-1)\div2nn 互质。
  • 因此中位数直接就是 (n+1)÷2(n+1)\div2 或直接 n÷2n\div2

2. nn22 的幂。

  • nn 只有质因数 22
  • 中位数是 n÷21n\div2-1

3. nn 是偶数但不是 22 的幂。

  • 我们从 n÷2n\div2 开始向下检查,找到第一个与 nn 互质的最大整数。
  • 因为 gcd(a,b)=gcd(a,ab)\gcd(a,b)=\gcd(a,a-b),所以与 nn 互质的数是成双成对的,所以这个数就是我们要找的中位互质数。

代码:

CPP
#include<bits/stdc++.h>
using namespace std;
int t;
long long hs(long long x){
    if(x%2==1)return x/2;//n为奇数情况
    if(x&(x-1)==0)return x/2-1;//n为2的幂的情况
    for(long long i=x/2;i>=1;i--){
        if(__gcd(i,x)==1)return i;
    }return 1;//因为数据n>=2,所以可写可不写。
}
int main(){
    cin>>t;
    while(t--){
        long long n;
        cin>>n;
        cout<<hs(n)<<endl;
    }
    return 0;
}
完结撒花!求赞

评论

2 条评论,欢迎与作者交流。

正在加载评论...