#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\n",res);
    }
    return 0;
}
//https://blog.csdn.net/m0_37286282/article/details/78869512(容斥原理详解)

2017乌鲁木齐区域赛K(容斥原理【求指定区间内与n互素的数的个数】)的更多相关文章

  1. 求指定区间内与n互素的数的个数 容斥原理

    题意:给定整数n和r,求区间[1, r]中与n互素的数的个数. 详细见容斥定理 详细代码如下 int solve(int r, int n) { vector<int>p; p.clear ...

  2. Uva10820 欧拉公式模板(求小于n且与n互素的数的个数)

    题意: 给出n,算出小于等于n的所有数中,有几对互质: 解法: 本质就是求有多少个2元组(x,y)满足:1 <= x,y <= n,且x与y互素. 除了(1,1)之外,其他所有的x和y都不 ...

  3. 2017乌鲁木齐区域赛D题Fence Building-平面图的欧拉公式

    这个题B站上面有这题很完整的分析和证明,你实在不懂,可以看看这个视频  https://www.bilibili.com/video/av19849697?share_medium=android&a ...

  4. 2017乌鲁木齐区域赛A(动态规划,组合数学,期望)

    #include<bits/stdc++.h>using namespace std;double c[110][110];double g[110];double dp[110][110 ...

  5. 2017乌鲁木齐区域赛I(带权并查集)

    #include<bits/stdc++.h>using namespace std;int f[200010];//代表元long long rl[200010];//记rl[i]为结点 ...

  6. 单调队列——求m区间内的最小值

    单调队列,顾名思义是指队列内的元素是有序的,队头为当前的最大值(单调递减队列)或最小值(单调递增序列),以单调递减队列为例来看队列的入队和出队操作: 1.入队: 如果当前元素要进队,把当前元素和队尾元 ...

  7. P1886 滑动窗口&&P1440 求m区间内的最小值

    声明:下面这两个题就不要暴力了,学一学单调队列吧 推荐博文:https://www.cnblogs.com/tham/p/8038828.html 单调队列入门题 P1440 求m区间内的最小值 题目 ...

  8. HDU-1695 GCD(求一个区间内与一个数互质的个数)

    题意: 给你一个T,是样例的个数,接下来是五个数l1,r1,l2,r2,k  前四个数代表两个区间(l1,r1),(l2,r2)这个题l1=1,l2=1; 取x1属于(1,r1),x2属于(1,r2) ...

  9. LG1440 求 m 区间内的最小值

    题目描述 一个含有 \(n\) 项的数列 (\(n≤ 2000000\)),求出每一项前的 \(m\) 个数到它这个区间内的最小值.若前面的数不足 \(m\) 项则从第 \(1\) 个数开始,若前面没 ...

随机推荐

  1. ibatis的resultClass与resultMap 的区别

    ibatis的resultClass与resultMap还是有很大的区别.以下是我碰到的一个问题. 配置文件写法如下: 1 sqlMap2 typeAlias alias="notice&q ...

  2. Oracle 11g的7个服务详解

    成功安装Oracle 11g后,共有7个服务,这七个服务的含义分别为:1. Oracle ORCL VSS Writer Service:Oracle卷映射拷贝写入服务,VSS(Volume Shad ...

  3. Selenium-几种等待方式

    强制等待 一直使用的time.sleep(5),可以放在任意地方,不好的地方,不太准确确定时间 隐形等待 driver.implicitly_wait(5) 设置了一个最长等待时间,如果在规定时间内网 ...

  4. BeanUtils介绍及使用

    JavaBeans事实上有三层含义.首先,JavaBeans是一种规范,一种在Java(包括JSP)中可重复使用的Java组件的技术规范,也可以说成我们常说的接口.其次,JavaBeans是一个Jav ...

  5. 【leetcode刷题笔记】Roman to Integer

    Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 t ...

  6. Poj1258_Agri-Net(最小生成树)

    一.Description(poj1258) Farmer John has been elected mayor of his town! One of his campaign promises ...

  7. Erlang generic standard behaviours -- gen_server terminate

    gen_server 主体 module 已经分析完了(http://www.cnblogs.com/--00/p/4271982.html),接着,分析下gen_server 中的terminate ...

  8. 机器学习:Jupyter Notebook中Matplotlib的使用

    一.matplotlib绘制折线图 matplotlib绘图的实质是折线图,将所有的点用直线连接起来,由于距离比较密,看起来像是个平滑的曲线: import matplotlib as mpl:加载m ...

  9. 使用ceph命令提示handle_connect_reply connect got BADAUTHORIZER

    输入命令提示如下错误: [root@node1 ~]# rados -p testpool ls 2017-10-21 06:13:25.743045 7f8f89b6d700 0 -- 192.16 ...

  10. Random获取不重复随机数

    Random R = new Random(Guid.NewGuid().GetHashCode());            int i = R.Next(9999);