[bzoj3512] DZY Loves Math IV

Description

给定n,m,求
\[
\sum_{i=1}^{n}\sum_{j=1}^{m}\varphi(ij)
\]
模10^9+7的值。

Input

仅一行,两个整数n,m。

Output

仅一行答案。

Sample Input

100000 1000000000

Sample Output

857275582

Solution

神题。。

考虑\(n\)比较小,试着枚举\(n\),处理\(m\)。

设\(s(n,m)=\sum_{i=1}^{m}\varphi(ni)\)

那么考虑拆解\(n\),设\(n=\prod_{i=1}^{k}a_i^{p_i}\),对于\(n\)的每一个质因子,提一个出来,剩下的可以直接乘上去,即:

设\(y=\prod_{i=1}^k a_i^{p_i-1}\),\(w=\prod_{i=1}^ka_i\),式子就变成:
\[
\begin{align}
s(n,m)&=y\cdot\sum_{i=1}^{m}\varphi(wi)\&=y\cdot \sum_{i=1}^{m}\varphi(\frac{w}{(i,w)})\cdot \varphi(i)\cdot (i,w)
\end{align}
\]
其中\((i,j)\)表示\(\gcd(i,j)\)。

然后由于:
\[
\sum_{d|n}\varphi(d)=n
\]
可以反过来把后面的\(\gcd\)化一下,即:
\[
\begin{align}
s(n,m)&=y\cdot \sum_{i=1}^{m}\varphi(\frac{w}{(i,w)})\cdot\varphi(i)\cdot\sum_{d|i\&d|w}\varphi(d) \&=y\cdot \sum_{i=1}^{m}\varphi(i)\cdot\sum_{d|i\&d|w}\varphi(
\frac{(i,w)}{d}) \varphi(\frac{w}{(i,w)})\&=y\cdot \sum_{i=1}^{m}\varphi(i)\cdot\sum_{d|i\&d|w}\varphi(
\frac{w}{d})\&=y\cdot \sum_{d|w}\varphi(\frac{w}{d})\sum_{i=1}^{\lfloor\frac{m}{d}\rfloor}\varphi(id)\&=y\cdot \sum_{d|w}\varphi(\frac{w}{d})s(d,\lfloor\frac{m}{d}\rfloor)
\end{align}
\]
然后这个东西变成了一个递归的形式,直接照着式子爆算一下就好了,记得记忆化。

当\(n=1\)时这个东西就变成了\(\sum_{i=1}^{m}\varphi(i)\),杜教筛一下就好了。

#include<bits/stdc++.h>
//#include<tr1/unordered_map>
using namespace std;
//using namespace std :: tr1;

#define ll long long
//#define ONLINE_JUDGE

#ifdef ONLINE_JUDGE
#define getchar() ((p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin)),p1==p2)?EOF:*p1++)
#endif

namespace fast_IO {
    char buf[1<<21],*p1=buf,*p2=buf;

    template <typename T> inline void read(T &x) {
        x=0;T f=1;char ch=getchar();
        for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-f;
        for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';x*=f;
    }
    template <typename T,typename... Args> inline void read(T& x,Args& ...args) {
        read(x),read(args...);
    }

    char buf2[1<<21],a[80];int p,p3=-1;

    inline void flush() {fwrite(buf2,1,p3+1,stdout),p3=-1;}
    template <typename T> inline void write(T x) {
        if(p3>(1<<20)) flush();
        if(x<0) buf2[++p3]='-',x=-x;
        do {a[++p]=x%10+48;} while(x/=10);
        do {buf2[++p3]=a[p];} while(--p);
        buf2[++p3]='\n';flush();
    }
    template <typename T,typename... Args> inline void write(T x,Args ...args) {
        write(x),write(args...);
    }
}

using fast_IO :: read;
using fast_IO :: write;
using fast_IO :: flush;

const int maxn = 3e6+10;
const int mod = 1e9+7;
const int N = 1e5+10;

int phi[maxn],pri[maxn],vis[maxn],tot,w[maxn],varphi[maxn];

void sieve() {
    phi[1]=1;w[1]=1;
    for(int i=2;i<maxn;i++) {
        if(!vis[i]) pri[++tot]=i,phi[i]=i-1,w[i]=i;
        for(int j=1;j<=tot&&i*pri[j]<maxn;j++) {
            vis[i*pri[j]]=1;
            if(i%pri[j]==0) {phi[i*pri[j]]=phi[i]*pri[j],w[i*pri[j]]=w[i];break;}
            phi[i*pri[j]]=phi[i]*(pri[j]-1);
            w[i*pri[j]]=w[i]*pri[j];
        }
    }
    for(int i=1;i<maxn;i++) varphi[i]=phi[i],phi[i]=(phi[i]+phi[i-1])%mod;
}

map<int,int> Phi,S[N];

int sum_phi(int x) {
    if(x<maxn) return phi[x];
    if(Phi[x]) return Phi[x];
    int res=1ll*x*(x+1)/2%mod,i=2;
    while(i<=x) {
        int pre=i;i=x/(x/i);
        res=(res-1ll*(i-pre+1)*sum_phi(x/i)%mod)%mod;i++;
    }return Phi[x]=(res+mod)%mod;
}

vector <int > Div;

int s(int n,int m) {
    if(!n) return 0;
    if(!m) return 0;
    if(n==1) return sum_phi(m);
    if(S[n][m]) return S[n][m];
    int y=n/w[n],res=0;
    for(int i=1;i*i<=w[n];i++) {
        if(w[n]%i) continue;
        int j=w[n]/i;
        res=(res+1ll*varphi[j]*s(i,m/i)%mod)%mod;
        if(i!=j) res=(res+1ll*varphi[i]*s(j,m/j)%mod)%mod;
    }
    return S[n][m]=1ll*res*y%mod;
}

int main() {
    sieve();
    int n,m;read(n,m);int ans=0;
    for(int i=1;i<=n;i++) ans=(ans+s(i,m))%mod;
    write(ans);
    flush();
    return 0;
}

原文地址:https://www.cnblogs.com/hbyer/p/10201732.html

时间: 2024-09-29 21:27:27

[bzoj3512] DZY Loves Math IV的相关文章

【bzoj3512】DZY Loves Math IV 杜教筛+记忆化搜索+欧拉函数

Description 给定n,m,求\(\sum_{i=1}^{n}\sum_{j=1}^{m}\varphi(ij)\)模10^9+7的值. Input 仅一行,两个整数n,m. Output 仅一行答案. Sample Input 100000 1000000000 Sample Output 857275582 数据规模 1<=n<=10^5,1<=m<=10^9. sol %%%ranwen!!! 前置技能: \(n=\sum_{d|n}\varphi(d)\) \(\v

bzoj 3512: DZY Loves Math IV

Description 给定n,m,求 模10^9+7的值. Solution 设 \(S(n,m)\) 表示 \(\sum_{i=1}^{m}\phi(n*i)\) \(Ans=\sum_{i=1}^{n}S(i,m)\) \(S(n,m)=\sum_{i=1}^{m}\phi(n*i)\) 如果 \(\mu(n)!=0\) 则有 \(\sum_{i=1}^{m}\phi(\frac{n}{gcd(i,n)})*\phi(i)*gcd(i,n)\) (因为要保证除完\(gcd\)之后,两数不含

【BZOJ】3309: DZY Loves Math 莫比乌斯反演优化

3309: DZY Loves Math Description 对于正整数n,定义f(n)为n所含质因子的最大幂指数.例如f(1960)=f(2^3 * 5^1 * 7^2)=3, f(10007)=1, f(1)=0. 给定正整数a,b,求sigma(sigma(f(gcd(i,j)))) (i=1..a, j=1..b). Input 第一行一个数T,表示询问数. 接下来T行,每行两个数a,b,表示一个询问. Output 对于每一个询问,输出一行一个非负整数作为回答. Sample In

[BZOJ3568]DZY Loves Math VII

本人BZOJ的处女作. 这题题面还是蛮有趣的吧. 然后三个问题都蛮有意思的. 要保证正确性,出数据还是异常蛋疼啊. 本来各出三题的.但是考虑到是OJ上的题,就搞在一起了.这样代码量就会比较大. [BZOJ3568]DZY Loves Math VII,布布扣,bubuko.com

【BZOJ 3560】 3560: DZY Loves Math V (欧拉函数)

3560: DZY Loves Math V Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 241  Solved: 133 Description 给定n个正整数a1,a2,-,an,求 的值(答案模10^9+7). Input 第一行一个正整数n. 接下来n行,每行一个正整数,分别为a1,a2,-,an. Output 仅一行答案. Sample Input 3 6 10 15 Sample Output 1595 HINT 1<=n<=1

bzoj 3309 DZY Loves Math

LINK:DZY Loves Math 一道比较有意思的数论题 原谅我的智障多调了40min. 可以简单的推式子推出 答案为\(\sum{w=1}^n\frac{n}{w}\frac{m}{w}\sum{x|w}\mu(x)f(\frac{w}{x})\) f函数定义和题目中一致. 考虑后面前缀和怎么求 发现光求f(x)复杂度都比较高.如果我们把f(x)求出再调和级数预处理 那得GG 1e7过不了log+根号 考虑考虑一下\(\mu\)和f的这种形式肯定值有局限 设后面的东西为g(x) 不难发现

bzoj 3309 DZY Loves Math - 莫比乌斯反演 - 线性筛

对于正整数n,定义f(n)为n所含质因子的最大幂指数.例如f(1960)=f(2^3 * 5^1 * 7^2)=3, f(10007)=1, f(1)=0. 给定正整数a,b,求sigma(sigma(f(gcd(i,j)))) (i=1..a, j=1..b). Input 第一行一个数T,表示询问数. 接下来T行,每行两个数a,b,表示一个询问. Output 对于每一个询问,输出一行一个非负整数作为回答. Sample Input 4 7558588 9653114 6514903 445

Bzoj3481 DZY Loves Math III

Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 310  Solved: 65 Description Input Output Sample Input 3 1 2 3 2 4 2 Sample Output 6 HINT 1<=N<=10,0<=Qi<=10^18,1<=Pi<=10^18,P>=2 本题仅四组数据. Source By Jc 数学问题 欧拉函数 Miller-Rabin Pollard-rho 花了

bzoj 3560 DZY Loves Math V - 线性筛 - 数论 - 扩展欧几里得算法

给定n个正整数a1,a2,…,an,求 的值(答案模10^9+7). Input 第一行一个正整数n. 接下来n行,每行一个正整数,分别为a1,a2,…,an. Output 仅一行答案. Sample Input 3 6 10 15 Sample Output 1595 Hint 1<=n<=10^5,1<=ai<=10^7.共3组数据. 题目大意 (题目过于简洁,完全不需要大意) 题目虽然很简洁,但是处处挖着坑等你跳. 原计划两个小时把今天讲的例题A完,实际上两个小时都被这道题