UVa 12493 Stars 【容斥 or 欧拉函数】

传送门
// 给定圆上n个点, 每m个点连一条线, 如果最后可以把所有的点都联通, 那么这就是一种合法状态, 如果两个m1 != m2, 但是最后连接出来的图形是一样的, 则方法算一种.

// 思路: 我们可以暴力出10以内的答案, 可以发现与n的性质有关, 实际上就是只有m和n互质的情况下才有可能走完所有的n个点, 否则一定走不完, 可以自己在图上画一画. (其实就是一个倍数关系)

画的过程中我们还可以发现 i 和 n - i (如果i和n互质), 画出来的图形是一样的. 所以我们知道答案就是 phi(n)/2, 其中phi(n)表示n的欧拉函数, 也就是小于n与n互质的个数. 所以这道题我们用欧拉函数做或者容斥定理. (不懂欧拉的建议百度~)

AC Code

ll phi(ll x){
    ll ans = x;
    for(ll i = 2; i*i <= x; i++){
        if(x % i == 0){
            ans = ans / i * (i-1);
            while(x % i == 0) x /= i;
        }
    }
    if(x > 1) ans = ans / x * (x-1);
    return ans;
}

void solve() {
    ll n ;
    while(cin >> n) {
        cout << phi(n)/2 << endl;
    }
}

你可能感兴趣的:(容斥定理,欧拉函数)