HDU 6641 TDL 異或性質

定義f(n,m)f(n,m)爲比nn大的第mm個與nn互質的數,給出(f(n,m)n)n(f(n,m)-n)\oplus nmm,求最小的nn

Source:2019 Multi-University Training Contest 6

因爲異或滿足自反性,不妨另(f(n,m)n)n=k(f(n,m)-n)\oplus n=k,則f(n,m)n=knf(n,m)-n=k\oplus n,因爲m100m\leq100,所以f(n,m)nf(n,m)-n不會超過1e3(具體最大沒算過,1e3完全足夠了),我們可以枚舉knk\oplus n,然後找出最小的滿足條件nn即可。
UPD:wa了兩次最後發現是inf開小了…

#include <bits/stdc++.h>
#define ll long long
ll gcd(ll p, ll q) { return q == 0 ? p : gcd(q, p % q); }
using namespace std;
const long long inf = ((1LL<<62)-1)|(1LL<<62);
const int maxi = 1e3 + 10;

ll k,m;
ll f(ll n,int m){
    ll cnt=m,i=n;
    while(cnt){
        i++;
        if(gcd(n,i)==1) cnt--;
    }
    return i;
}
int main() {
    int T;
    scanf("%d", &T);
    while(T--){
        scanf("%lld%lld",&k,&m);
        ll minn=inf;
        for(ll i=0;i<=maxi;i++){
            ll n=i^k;//n=(k^n)^k
            if(n && f(n,m)==n+i) {
                minn = min(minn, n);
            }
        }
        if(minn==inf) printf("-1\n");
        else printf("%lld\n",minn);
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章