• 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(容斥原理详解)

    保持热爱 不懈努力 不试试看怎么知道会失败呢(划掉) 世上无难事 只要肯放弃(划掉)
  • 相关阅读:
    DELPHI 各版本下载
    一个好的网站,学习前端
    没那么难,谈CSS的设计模式
    一个前端的自我修养
    如何学习Javascript
    jQuery WeUI V0.4.2 发布
    微信官方开源UI库-WeUI
    js与php传递参数
    ?js调用PHP里的变量,怎么弄?
    Liferay7 BPM门户开发之23: 了解内置工作流(Kaleo Workflow)
  • 原文地址:https://www.cnblogs.com/ldudxy/p/9520194.html
Copyright © 2020-2023  润新知