[BZOJ3512] DZY Loves Math IV

13 篇文章 0 订阅

传送门
昨天花了好久好像是看懂了,那今天早上尝试自己推一遍柿子 顺便水了一篇博客

D e s c r i p t i o n \bf {Description} Description

∑ i = 1 n ∑ i = 1 m φ ( i j ) \sum_{i=1}^n \sum_{i=1}^m\varphi(ij) i=1ni=1mφ(ij)

1 ≤ n ≤ 1 0 5 , 1 ≤ m ≤ 1 0 9 1 \leq n \leq 10^5 , 1 \leq m \leq 10^9 1n105,1m109,模 1 0 9 + 7 10^9+7 109+7

S o l u t i o n \bf Solution Solution

先给个结论,当 ∣ μ ( n ) ∣ = 1 |\mu(n)|=1 μ(n)=1 时,有

φ ( n i ) = φ ( i ) ∑ d ∣ ( n , i ) φ ( n d ) \varphi(ni)=\varphi(i) \sum_{d|(n,i)}\varphi(\frac{n}{d}) φ(ni)=φ(i)d(n,i)φ(dn)

简单证明一下(想了一节晚自习才想通呢QAQ)
(gcd的表示有点乱,不要在意)

φ ( n i ) = φ ( n ) ⋅ φ ( i g c d ( n , i ) ) ⋅ g c d ( n , i ) \varphi(ni)=\varphi(n) \cdot \varphi(\frac{i}{gcd(n,i)}) \cdot gcd(n,i) φ(ni)=φ(n)φ(gcd(n,i)i)gcd(n,i)
= φ ( i ) ⋅ φ ( n g c d ( n , i ) ) ⋅ g c d ( n , i ) =\varphi(i) \cdot \varphi(\frac{n}{gcd(n,i)}) \cdot gcd(n,i) =φ(i)φ(gcd(n,i)n)gcd(n,i)
= φ ( i ) ⋅ φ ( n g c d ( n , i ) ) ⋅ ∑ d ∣ ( n , i ) φ ( d ) =\varphi(i) \cdot \varphi(\frac{n}{gcd(n,i)}) \cdot \sum_{d|(n,i)}\varphi(d) =φ(i)φ(gcd(n,i)n)d(n,i)φ(d)
= φ ( i ) ⋅ φ ( n g c d ( n , i ) ) ⋅ ∑ d ∣ ( n , i ) φ ( g c d ( n , i ) d ) =\varphi(i) \cdot \varphi(\frac{n}{gcd(n,i)}) \cdot \sum_{d|(n,i)}\varphi(\frac{gcd(n,i)}{d}) =φ(i)φ(gcd(n,i)n)d(n,i)φ(dgcd(n,i))
= φ ( i ) ∑ d ∣ ( n , i ) φ ( n d ) =\varphi(i) \sum_{d|(n,i)}\varphi(\frac{n}{d}) =φ(i)d(n,i)φ(dn)

推的时候要注意 n n n 的性质,还要熟悉 φ \varphi φ,不然就推不粗来QAQ

然后令 S ( n , m ) = ∑ i = 1 m φ ( n i ) S(n,m)=\sum_{i=1}^m \varphi(ni) S(n,m)=i=1mφ(ni),令 P P P n n n 所有质因子的乘积, Q = n P Q=\dfrac{n}{P} Q=Pn,然后可得

S ( n , m ) = Q ⋅ ∑ i = 1 m φ ( i ) ∑ d ∣ ( P , i ) φ ( P d ) S(n,m)=Q \cdot \sum_{i=1}^m \varphi(i) \sum_{d|(P,i)} \varphi(\frac{P}{d}) S(n,m)=Qi=1mφ(i)d(P,i)φ(dP)

先枚举因数,得到

S ( n , m ) = Q ⋅ ∑ d ∣ P φ ( P d ) ∑ i = 1 ⌊ m d ⌋ φ ( d i ) S(n,m)=Q \cdot \sum_{d|P}\varphi(\frac{P}{d}) \sum_{i=1}^{\lfloor \frac{m}{d} \rfloor} \varphi(di) S(n,m)=QdPφ(dP)i=1dmφ(di)
= Q ⋅ ∑ d ∣ P φ ( P d )   S ( d , ⌊ m d ⌋ ) =Q \cdot \sum_{d|P} \varphi(\frac{P}{d}) \ S(d,\left \lfloor \frac{m}{d} \right \rfloor) =QdPφ(dP) S(d,dm)

然后就阔以记忆化啦?
n = 1 n=1 n=1 的时候就是 φ \varphi φ 的前缀和,杜教筛板子啦?
复杂度玄学?不会证啦。
代码?还没写出来啦。
写出来再贴吧。


写出来啦,十分暴力QAQ

//#pragma GCC optimize(2)
//#pragma GCC optimize(3)
#include<bits/stdc++.h>
#include<tr1/unordered_map>
#define LL long long
#define re register
#define fr(i,x,y) for(int i=(x);i<=(y);i++)
#define rf(i,x,y) for(int i=(x);i>=(y);i--)
#define frl(i,x,y) for(int i=(x);i<(y);i++)
using namespace std;
using namespace tr1;
const int N=2000002;
const int INF=2147483647;
const int p=1e9+7;
int n,m;

void read(int &x){ scanf("%d",&x); }

void Add(int &x,int y){
	x+=y;
	while(x<0) x+=p;
	while(x>=p) x-=p;
}

int phi[N];
int pri[N/10],b[N],L;
void init(){
	phi[1]=1;
	frl(i,2,N){
		if (!b[i]) pri[++L]=i,phi[i]=i-1;
		for(int j=1;j<=L&&i*pri[j]<N;j++){
			b[i*pri[j]]=1;
			if (i%pri[j]==0){
				phi[i*pri[j]]=phi[i]*pri[j];
				break;
			}
			phi[i*pri[j]]=phi[i]*(pri[j]-1);
		}
	}
	frl(i,2,N) Add(phi[i],phi[i-1]);
}

map<int,int> s,mp[N];
int S(int n,int m){
	//cout<<n<<' '<<m<<endl;
	if (n==0||m==0) return 0;
	if (n==1){
		if (m<N) return phi[m];
		if (s.count(m)) return s[m];
		int ans=(1LL*m*(m+1)/2)%p;
		for(re int L=2,r=2;L<=m;L=r+1)
		 r=m/(m/L),Add(ans,-1LL*S(n,m/L)*(r-L+1)%p);
		return s[m]=ans;
	}
	if (mp[n].count(m)) return mp[n][m];
	int ans=0;
	for(re int i=1;i*i<=n;i++)
	 if (n%i==0){
	 	Add(ans,1LL*(phi[n/i]-phi[n/i-1])*S(i,m/i)%p);
	 	if (n/i!=i) Add(ans,1LL*(phi[i]-phi[i-1])*S(n/i,m/(n/i))%p);
	 }
	return mp[n][m]=ans;
}

int main(){
	//freopen("1.in","r",stdin);
	init();
	read(n);read(m);
	int ans=0;
	fr(xx,1,n){
		int s=1,x=xx;
		for(int i=2;i*i<=x;i++)
		 if (x%i==0){
		 	s*=i;
		 	while(x%i==0) x/=i;
		 }
		s*=x;
		Add(ans,1LL*S(s,m)*(xx/s)%p);
		//cout<<S(s,m)*(xx/s)<<endl;
	}
	cout<<ans<<endl;
	//cout<<S(s,m)<<endl;
	//printf("%lld\n",1LL*S(s,m)*(n/s)%p);
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值