您的位置:首页 > 其它

HDU 3501 Calculation 2 【容斥定理】

2018-01-21 20:41 267 查看
传送门

// 题意: 给定一个n问1-n中与n不互质的数的和是多少.

// 那么1-n中与n不互质的数那么就是n的素因子的倍数(不是素因子的也一定是其中的某个素因子的倍数), 的和, 假设n = 6, 它的素因子为2, 3, 那么我们算一遍2的会算2, 4, 6, 算3的会算3, 6, 6 就算重了一遍, 所以显然就要用容斥定理了, 枚举下所有素因子的组合情况就是了. 然后求和可以直接套用等差数列的公式即可.

比如2 就等于 ans += 2 ^ (1+2+…+n/2), 后面就是一个等差数列….

AC Code

vector<int>ve;
void rongchi(ll n) {
int m = n; ve.clear();
for (int i = 2 ; i*i <= n ; i ++) {
if (m % i == 0) {
ve.push_back(i);
while(m % i == 0) m /= i;
}
}
if (m != 1) ve.push_back(m);

ll ans = 0;
for (int i = 1 ; i < (1<<ve.size()) ; i ++) {
ll tot = 1; int cnt = 0;
for (int j = 0 ; j < ve.size() ; j ++) {
if (i & (1<<j)) {
tot *= ve[j];
cnt++;
}
}
ll tmp = n / tot;
if (cnt & 1) {
ans += tot*(tmp*(tmp-1)/2);
}
else ans -= tot*(tmp*(tmp-1)/2);
}
cout << ans%mod << endl;
}
void solve()
{
ll n ;
while(cin >> n && n) {
rongchi(n);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: