P3768 简单的数学题(莫比乌斯反演)

[题目链接] https://www.luogu.org/problemnew/show/P3768

[题目描述]

\(\sum_{i=1}^{n}\sum_{j=1}^{n}i* j* gcd(i,j)\mod\ p\)

[欧拉反演题解] https://www.luogu.org/blog/zhoutb2333/solution-p3768

/*
-----------------------
最大测试点,时限6s
[Input]
1000000007 9786510294
[Output]
27067954
-----------------------2019.2.24
*/
#include<bits/stdc++.h>
#include<tr1/unordered_map>
//#define int long long
using namespace std;
typedef long long LL;
const int INF=1e9+7;
inline LL read(){
    register LL x=0,f=1;register char c=getchar();
    while(c<48||c>57){if(c==‘-‘)f=-1;c=getchar();}
    while(c>=48&&c<=57)x=(x<<3)+(x<<1)+(c&15),c=getchar();
    return f*x;
}

const int MAXN=5e6+5;

int phi[MAXN],prime[MAXN];bool vis[MAXN];
LL sphi[MAXN];
LL n,mod,inv6,ans;
unordered_map <LL,LL> Sphi;

inline LL qpow(LL a,LL b){
    LL res=1;
    while(b){
        if(b&1) (res*=a)%=mod;
        (a*=a)%=mod;
        b>>=1;
    }
    return res;
}

inline void init(int n){
    phi[1]=1;
    for(int i=2;i<=n;i++){
        if(!vis[i]){
            prime[++prime[0]]=i;
            phi[i]=i-1;
        }
        int x;
        for(int j=1;j<=prime[0]&&(x=i*prime[j])<=n;j++){
            vis[x]=1;
            if(i%prime[j]==0){
                phi[x]=phi[i]*prime[j];
                break;
            }
            phi[x]=phi[i]*phi[prime[j]];
        }
    }
    for(int i=1;i<=n;i++){
        sphi[i]=(sphi[i-1]+1ll*phi[i]*i%mod*i%mod)%mod;
    }
}

inline LL s2(LL x){
    x%=mod;
    return x*(x+1)%mod*(2*x+1)%mod*inv6%mod;
}

inline LL s3(LL x){
    x%=mod;
    return ((x*(x+1)/2)%mod)*((x*(x+1)/2)%mod)%mod;
}

inline LL S_phi(LL n){
    if(n<MAXN) return sphi[n];
    if(Sphi[n]) return Sphi[n];
    LL res=s3(n);
    for(LL l=2,r;l<=n;l=r+1){
        r=n/(n/l);
        res=(res-(1ll*(s2(r)-s2(l-1)+mod)%mod*S_phi(n/l)%mod)+mod)%mod;
    }
    return Sphi[n]=res;
}

int main(){
    mod=read(),n=read();
    inv6=qpow(6,mod-2);
    init(MAXN-1);
    for(LL l=1,r;l<=n;l=r+1){
        r=n/(n/l);
        (ans+=1ll*(S_phi(r)-S_phi(l-1)+mod)%mod*s3(n/l)%mod)%=mod;
    }
    printf("%lld\n",ans);
}

原文地址:https://www.cnblogs.com/lizehon/p/10425369.html

时间: 2024-07-31 13:03:41

P3768 简单的数学题(莫比乌斯反演)的相关文章

SWJTU 2212 简单的GCD (莫比乌斯反演)

简单的GCD Time Limit:1000MS  Memory Limit:32768KTotal Submit:12 Accepted:4 Description 问题很简单(洁),有 T 个询问,每次询问 a,b,d ,问有多少对 (x,y) 满足 1 ≤ x ≤ a, 1 ≤ y ≤ b ,且 Gcd(x,y) = d . 注意这里(x=1, y=2)与(x=2, y=1)认为是一对. Input 输入第一行为T,表示测试数据组数. 下面的T行,每行包括三个整数a,b,d. 1 ≤ d

Luogu P3768 简单的数学题

非常恶心的一道数学题,推式子推到吐血. 光是\(\gcd\)求和我还是会的,但是多了个\(ij\)是什么鬼东西. \[\sum_{i=1}^n\sum_{j=1}^nij\gcd(i,j)=\sum_{d=1}^nd\sum_{i=1}^n\sum_{j=1}^nij[\gcd(i,j)=d]\] 很套路的把后面的\(d\)提出来: \[\sum_{d=1}^nd\sum_{i=1}^n\sum_{j=1}^nij[\gcd(i,j)=d]=\sum_{d=1}^nd^3\sum_{i=1}^{

[P3768]简单的数学题

Description: 求出\((\sum_{i=1}^n \sum_{j=1}^n ij\ gcd\ (i,j)) mod\ p\) Hint: \(n<=10^{10}?\) Solution: \(Ans=\sum_{d=1}^nd^3 \sum_{i=1}^{\lfloor \frac{n}{d} \rfloor} \sum_{j=1}^{\lfloor \frac{n}{d} \rfloor} ij\ \ [gcd(i,j)==1]?\) \(Ans=\sum_{d=1}^nd^3\

BZOJ 2301: [HAOI2011]Problem b(莫比乌斯反演)

http://www.lydsy.com/JudgeOnline/problem.php?id=2301 题意:对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. 思路: 先简单介绍一下莫比乌斯反演在数论中的作用: 那么怎么做这道题呢? 接下来我们只需要枚举d就可以了,但是这里还有一个可以优化的地方,我们依次+1枚举d的时候,有时候n/d和m/d是不会改变的,比如说现在n=m=,那么d=3,4,5时

【Luogu3768】简单的数学题(莫比乌斯反演,杜教筛)

[Luogu3768]简单的数学题(莫比乌斯反演,杜教筛) 题面 洛谷 \[求\sum_{i=1}^n\sum_{j=1}^nijgcd(i,j)\] $ n<=10^9$ 题解 很明显的把\(gcd\)提出来 \[\sum_{d=1}^nd\sum_{i=1}^n\sum_{j=1}^nij[gcd(i,j)==d]\] 习惯性的提出来 \[\sum_{d=1}^nd^3\sum_{i=1}^{n/d}\sum_{j=1}^{n/d}ij[gcd(i,j)==1]\] 后面这玩意很明显的来一发

bzoj 2440 简单莫比乌斯反演

题目大意: 找第k个非平方数,平方数定义为一个数存在一个因子可以用某个数的平方来表示 这里首先需要考虑到二分才可以接下来做 二分去查找[1 , x]区间内非平方数的个数,后面就是简单的莫比乌斯反演了 容斥原理的思想,首先考虑所有数都属于非平方数 那么就是x 然后对于每一个平方数都要减去,但是这里应该只考虑质数的平方数就可以了 那么就扩展为x - x/(2^2) - x/(3^2) - x/(k^2).... 然后因为中间存在重复减的那么要加回来 -> x - x/(2^2) - x/(3^3) 

P3768 【简单的数学题】

P3768 [简单的数学题] \(Ans=\sum ^{n}_{i=1}\sum ^{n}_{j=1}ijgcd(i,j)\) \(=\sum ^{n}_{i=1}\sum ^{n}_{j=1}ij\sum _{k|i,k|j} φ(k)\) \(=\sum ^{n}_{k=1} φ(k) \sum _{k|i}\sum _{k|j}ij\) \(=\sum ^{n}_{k=1}\varphi (k) k^{2} (\sum ^{n/k}_{i=1}i)^{2}\) \(=\sum ^{n}_{

「洛谷P3768」简单的数学题

题目链接 简单的数学题 题目描述 输入一个整数n和一个整数p,你需要求出 \[\sum_{i=1}^n\sum_{j=1}^n (i\cdot j\cdot gcd(i,j))\ mod\ p\]? 其中\(gcd(a,b)\)表示\(a\)与\(b\)的最大公约数 输入 一行两个整数\(p,n\) 输出 一行一个整数,为题目中所求值 样例 样例输入 998244353 2000 样例输出 883968974 数据范围 \(n\leq 10^{10}\) \(5\times 10^8 \leq

luogu3455 [POI2007]ZAP-Queries 简单的莫比乌斯反演

link ms是莫比乌斯反演里最水的题... 题意:对于给定的整数a,b和d,有多少正整数对x,y,满足x<=a,y<=b,并且gcd(x,y)=d. 多组询问, T<=50000,d,a,b<=50000 稍微推下shizi \(\sum_{i=1}^a\sum_{j=1}^b[\gcd(i,j)=d]\) \(=\sum_{i=1}^{a/k}\sum_{j=1}^{b/k}[\gcd(i,j)=1]\) \(=\sum_{i=1}^{a/k}\sum_{j=1}^{b/k}\