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\)之后,两数不含相同的质因子,所以 \(\mu(n)!=0\))
\(\sum_{i=1}^{m}\phi(\frac{n}{gcd(i,n)})*\phi(i)*\sum_{d|i,d|n}\phi(d)\)
因为第一项和第三项是互质的 , 所以可以合并.
\(\sum_{i=1}^{m}\phi(i)*\sum_{d|n,d|i}\phi(\frac{n}{d})\)
\(\sum_{d=1}^{n}\phi(\frac{n}{d})*\sum_{i=1}^{\frac{m}{d}}\phi(d*i)\)
\(\sum_{d=1}^{n}\phi(\frac{n}{d})*S(d,\lfloor\frac{m}{d}\rfloor)\)
递归处理即可

如果 \(\mu(n)=0\)
我们直接提出 \(n\) 的多出的质因子之积 \(a\),使得 \(\mu(\frac{n}{a})!=0\)
那么 \(S(n,m)=\sum_{i=1}^{m}\phi(n*i)\) 中也可以提出 \(a\) 了,因为相同的质因子只会被算一次
根据定义式 \(\phi(n)=n*\Pi p_i\),所以 \(a\) 唯一的贡献就是使前面的 \(n\) 乘了个 \(a\)
\(a*S(n,m)=\sum_{i=1}^{m}\phi(\frac{n}{a}*i)=a*S(\frac{n}{a},m)\)
递归处理即可

边界条件 \(m=1?\) 时,结果为 \(\phi(n)?\), \(n=1?\) 时,跑一个杜教筛就行了

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10,mod=1e9+7;
int n,prime[N],num=0,m,phi[N],mu[N],pre[N],la[N],s[N];bool vis[N];
void priwork(){
    phi[1]=s[1]=1;
    for(int to,i=2;i<N;i++){
        if(!vis[i])prime[++num]=i,phi[i]=i-1,mu[i]=-1,pre[i]=i;
        for(int j=1;j<=num && i*prime[j]<N;j++){
            vis[to=i*prime[j]]=1;pre[to]=prime[j];
            if(i%prime[j])phi[to]=phi[i]*(prime[j]-1),mu[to]=-mu[i];
            else {phi[to]=phi[i]*prime[j];break;}
        }
        s[i]=(s[i-1]+phi[i])%mod;
    }
    for(int i=2;i<=n;i++){
        if(mu[i])continue;
        int last=0,x=i;la[i]=1;
        while(x>1){
            if(pre[x]==last)la[i]*=pre[x];
            last=pre[x];x/=pre[x];
        }
    }
}
map<int,int>S[N],T;
inline int calc(int n){
    if(n<N)return s[n];
    if(T.find(n)!=T.end())return T[n];
    int ret=(1ll*n*(n+1)>>1)%mod;
    for(int i=2,r;i<=n;i=r+1){
        r=n/(n/i);
        ret=(ret-1ll*calc(n/i)*(r-i+1))%mod;
    }
    if(ret<0)ret+=mod;
    return T[n]=ret;
}
inline int solve(int n,int m){
    if(m==1)return phi[n];
    if(n==1)return calc(m);
    if(S[n].find(m)!=S[n].end())return S[n][m];
    if(!mu[n])return 1ll*la[n]*solve(n/la[n],m)%mod;
    int ret=0,lim=min(m,(int)sqrt(n));
    for(int i=1;i<=lim;i++){
        if(n%i==0){
            if(i*i!=n)ret=(ret+1ll*phi[n/i]*solve(i,m/i)+1ll*phi[i]*solve(n/i,m/(n/i)))%mod;
            else ret=(ret+1ll*phi[n/i]*solve(i,m/i))%mod;
        }
    }
    return S[n][m]=ret;
}
int main(){
  freopen("pp.in","r",stdin);
  freopen("pp.out","w",stdout);
  cin>>n>>m;
  priwork();
  int ans=0;
  for(int i=1;i<=n;i++)ans=(ans+solve(i,m))%mod;
  printf("%d\n",ans);
  return 0;
}

原文地址:https://www.cnblogs.com/Yuzao/p/8546115.html

时间: 2024-10-10 10:30:44

bzoj 3512: DZY Loves Math IV的相关文章

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

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完,实际上两个小时都被这道题

BZOJ 3309 DZY Loves Math 莫比乌斯反演

题目大意: 枚举d=gcd(i,j),得到 现在我们只需要知道Σ[d|T]f(d)μ(T/d)的前缀和就行了 设这个函数为g(x) 观察这个函数 由于含平方因子数的μ值都为零,因此我们只考虑μ(T/d)!=0的数 令T=p1^a1*p2^a2*...*pk^ak,d=p1^b1*p2^b2*...*pk^bk 那么0<=(ai-bi)<=1 如果存在ai≠aj(i≠j),那么我们可以将所有的a分为两部分:最大的集合A和非最大的集合B 很显然f值由A中的选取方案决定 对于A中的每种选取方案,μ值

BZOJ 3560 DZY Loves Math V 数论

题目大意:给定a1,a2,...,an,求 由于φ是积性函数,我们可以将i1i2...in分解质因数,对于每个质因数分开讨论,求积即可 将每个a分解质因数,假设分解后某个质数p在每个ai中的次数分别是bi,那么p对答案的贡献就是 于是对p^j维护一个前缀和,直接计算即可 #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define MOD 10000

莫比乌斯反演 bzoj 3309 DZY Loves Math

好久没有写反演了 感觉不会了 首先推一个经典的式子啊 \[ans = \sum_{D=1}^{n}\sum_{d|D}f(d)\mu(\frac{D}{d})\frac{n}{D}\frac{m}{D}\] 记\(g(D) = \sum_{d|D}f(d)\mu(\frac{D}{d})\) 结论挺好找的啊 把一个数拆成\({p_k}^{a_k}\)形式 如果所有\(a_k\)相同 那么\(g(D) = (-1)^{k+1}\) 否则\(g(D) = 0\) 证明就考虑两个集合 所有次幂为最大的

【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 3309 DZY Loves Math——反演+线性筛

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3309 像这种数据范围,一般是线性预处理,每个询问 sqrt (数论分块)做. 先反演一番.然后 f( ) 还不能一个就花 log 的时间,所以要分析性质. 设 n 一共 m 个质因数,其中最大的指数是 t . 已有 Σ(d|n) f(d)*u(n/d) ,如果 u( ) 的部分含有指数>=2的质因子,就无贡献:所以 u( ) 里每种质因数选1个或0个,一共 2^m 种. 如果 n 里有一个

[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)\) 那么考