21天好习惯第一期-17

容斥原理

如果不考虑重复计算,步长step的贡献为m*\frac{\frac{m}{step}-1}{2}如果不考虑重复计算,步长step的贡献为m∗2stepm​−1​
考虑到会重复计算,如果m的因子x青蛙能踩到,在计算前用cnt[x]=1标记x应该被算一次考虑到会重复计算,如果m的因子x青蛙能踩到,在计算前用cnt[x]=1标记x应该被算一次
计算时从小到大遍历m的因子,tmp=cnt[i]-sum[i]表示i及i的倍数对答案的贡献情况计算时从小到大遍历m的因子,tmp=cnt[i]−sum[i]表示i及i的倍数对答案的贡献情况
如果tmp<0表示i及i的倍数被多加了tmp次,tmp=1表示i及i的倍数还没被计算,tmp=0表示i及i的倍数已经计算或者没有贡献如果tmp<0表示i及i的倍数被多加了tmp次,tmp=1表示i及i的倍数还没被计算,tmp=0表示i及i的倍数已经计算或者没有贡献
1故m的因子i的贡献为m*\frac{\frac{m}{step}-1}{2}*(cnt[i]-sum[i])1故m的因子i的贡献为m∗2stepm​−1​∗(cnt[i]−sum[i])
加一次x,sum[k]就加一次,减一次x,sum[k]就减一次,表示x实际被加了几次,k为x的倍数加一次x,sum[k]就加一次,减一次x,sum[k]就减一次,表示x实际被加了几次,k为x的倍数
计算完一个因子i后维护i的倍数的sum[]数组,sum[k]+=cnt[i]-sum[i]计算完一个因子i后维护i的倍数的sum[]数组,sum[k]+=cnt[i]−sum[i]
不考虑输入,复杂度O((log _{2}m)^{2})不考虑输入,复杂度O((log2​m)2)
My Code:MyCode:

#include<bitsdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e4+10;
ll com[maxn];
ll t,n,m,ans;
ll euler(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;
}
bool check(ll x) {
    for(int i = 0; i < n; i++)
        if(x%com[i] == 0)
            return true;
    return false;
}
int main() {
    cin>>t;
    for(ll cas=1;cas<=t;++cas,ans=0) {
        bool Prime = false;
        cin>>n>>m;
        for(ll i=0,x,g;i<n;++i) {
            cin>>x;
            com[i]=__gcd(x,m);
            if(com[i] == 1) Prime = true;
        }
        if(Prime) ans = m*(m-1)/2;
        else {
            for(int i = 2; i*i <= m; i++) if(m%i == 0){
                if(check(i)) ans += euler(m/i)*m/2;
                if(i*i!=m && check(m/i)) ans+= euler(i)*m/2;
            }
        }
        printf("Case #%lld: %lld\n",cas,ans);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值