zoukankan      html  css  js  c++  java
  • 2017乌鲁木齐区域赛K(容斥原理【求指定区间内与n互素的数的个数】)

    #include<bits/stdc++.h>
    using namespace std;
    const long long mod = 998244353;
    typedef const long long ll;
    vector<long long>p;
    long long inv(long long x,long long y)//快速幂求逆元模板(以乘代除)
    {
        long long r=1;
        while(y>0)
        {
            if(y&1)
                r=(r*x)%mod;
            y>>=1;
            x=x*x%mod;
        }
        return r;
    }
    long long solve(long long n,long long r)//容斥原理求指定区间内与n互素的数的个数模板
    {
        p.clear();
        for(long long i=2;i*i<=n;i++)
        {
            if(n%i==0)
                p.push_back(i);//将素因子放入向量
            while(n%i==0)
                n/=i;
        }
        if(n>1)
            p.push_back(n);//如果还有剩余的素因子
        long long sum=0;
        for(int msk=1;msk<(int)(1<<p.size());msk++)
        {
            long long mult=1ll;
            int bits=0;
            for(int i=0;i<(ll)p.size();i++)
            {
                if(msk&(1<<i))
                {
                    bits++;
                    mult*=p[i];
                }
            }
            ll cur=r/mult;
            if(bits&1)//奇加偶减
                sum=(sum+(mult*mult%mod)*(cur*(cur+1)%mod*(2*cur+1)%mod*inv(6,mod-2)%mod)%mod)%mod;//平方和公式
            else
                sum=(sum-(mult*mult%mod)*(cur*(cur+1)%mod*(2*cur+1)%mod*inv(6,mod-2)%mod)%mod+mod)%mod;
        }
        return sum;
    }
    int main()
    {
        int t;
        scanf("%d",&t);
        while(t--)
        {
            long long n;
            scanf("%lld",&n);
            long long sum=0;
            sum=((n)*(n+1)%mod*(2*n+1)%mod*inv(6,mod-2))%mod;//sigema(1~k)i^2=(k)*(k+1)*(2*k+1)/6
            long long res=(sum-solve(n,n)+mod)%mod;/*求指定区间内与n互素的数的个数:
    给出整数n和r。求区间[1;r]中与n互素的数的个数。
    去解决它的逆问题,求不与n互素的数的个数。
    考虑n的所有素因子pi(i=1…k)
    在[1;r]中有多少数能被pi整除呢?它就是:
    然而,如果我们单纯将所有结果相加,会得到错误答案。有些数可能被统计多次(被好几个素因子整除)。所以,我们要运用容斥原理来解决。
    我们可以用2^k的算法求出所有的pi组合,然后计算每种组合的pi乘积,通过容斥原理来对结果进行加减处理。
    关于此问题的最终实现*/
            printf("%lld ",res);
        }
        return 0;
    }
    //https://blog.csdn.net/m0_37286282/article/details/78869512(容斥原理详解)

    保持热爱 不懈努力 不试试看怎么知道会失败呢(划掉) 世上无难事 只要肯放弃(划掉)
  • 相关阅读:
    【Alpha版本】 第六天 11.14
    HashMap(JDK8) 源码分析及夺命9连问
    JUC基础
    快乐的一天从AC开始 | 20210804 | CF1549C
    快乐的一天从AC开始 | 20210803 | P3482
    快乐的一天从AC开始 | 20210802 | P2034
    快乐的一天从AC开始 | 20210801 | P1988
    快乐的一天从AC开始 | 20210731 | P2825
    快乐的一天从AC开始 | 20210730 | P4656
    快乐的一天从AC开始 | 20210729 | P5346
  • 原文地址:https://www.cnblogs.com/ldudxy/p/9520194.html
Copyright © 2011-2022 走看看