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;
}
posted @ 2019-08-08 18:23  Mr.doublerun  阅读(13)  评论(0)    收藏  举报