310人阅读 评论(0)

# 性质

1、f(a,b)=f(b,a)
2、f(a,b)*(b-a)=f(a,b-a)*b

(a,b)<=>(b,a)
(a,b)<=>(a,b-a)

f(a,x)/x=f(a,b)/b
f(a,b)/a=f(y,b)/y

nd=1a[d]n/di=1n/dj=1[(i,j)=1]ij$\sum_{d=1}^na[d]*\sum_{i=1}^{n/d}\sum_{j=1}^{n/d}[(i,j)=1]*ij$

# 莫比乌斯意义

ni=1nj=1[(i,j)=1]ij$\sum_{i=1}^n\sum_{j=1}^n[(i,j)=1]*ij$
ni=1nj=1ijd|i,d|jμ(d)$\sum_{i=1}^n\sum_{j=1}^nij*\sum_{d|i,d|j}\mu(d)$
nd=1μ(d)d2S(n/d)2$\sum_{d=1}^n\mu(d)*d^2*S(n/d)^2$

d|nμ(d)d2[S(n/d)2S(n/d1)2]$\sum_{d|n}\mu(d)*d^2*[S(n/d)^2-S(n/d-1)^2]$
d|nμ(d)d2[S(n/d)+S(n/d1)][S(n/d)S(n/d1)]$\sum_{d|n}\mu(d)*d^2*[S(n/d)+S(n/d-1)]*[S(n/d)-S(n/d-1)]$
d|nμ(d)d2[2S(n/d)n/d]n/d$\sum_{d|n}\mu(d)*d^2*[2S(n/d)-n/d]*n/d$
d|nμ(d)d2(n/d)3$\sum_{d|n}\mu(d)*d^2*(n/d)^3$
n2d|nμ(d)n/d$n^2*\sum_{d|n}\mu(d)*n/d$
n2ϕ(n)$n^2*\phi(n)$

# 欧拉意义

iiϕ(i)$i*i*\phi(i)$
i=1也恰好满足。

# 求答案

#include<cstdio>
#include<algorithm>
#define fo(i,a,b) for(i=a;i<=b;i++)
using namespace std;
typedef long long ll;
const int maxn=4000000+10,B=2000,mo=1000000007;
int sum[B+10],num[maxn],a[maxn],belong[maxn];
int pri[maxn],phi[maxn],g[maxn];
bool bz[maxn];
int i,j,k,d,y,l,t,n,m,p,tot,top,ans;
ll x;
int gcd(int a,int b){
return b?gcd(b,a%b):a;
}
int getsum(int x){
if (!x) return 0;
int i,t=0,y=belong[x];
t=sum[y-1];
(t+=num[x])%=mo;
return t;
}
int qsm(int x,int y){
if (!y) return 1;
int t=qsm(x,y/2);
t=(ll)t*t%mo;
if (y%2) t=(ll)t*x%mo;
return t;
}
int main(){
scanf("%d%d",&m,&n);
fo(i,1,n){
belong[i]=(i-1)/B+1;
a[i]=(ll)i*i%mo;
if (belong[i]==belong[i-1]){
num[i]=(num[i-1]+a[i])%mo;
(sum[belong[i]]+=a[i])%=mo;
}
else{
num[i]=a[i];
sum[belong[i]]=(sum[belong[i]-1]+a[i])%mo;
}
}
phi[1]=1;
fo(i,2,n){
if (!bz[i]){
pri[++top]=i;
phi[i]=i-1;
}
fo(j,1,top){
if ((ll)i*pri[j]>n) break;
bz[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);
}
}
fo(i,1,n) g[i]=(g[i-1]+(ll)i*i%mo*phi[i]%mo)%mo;
while (m--){
scanf("%d%d%lld%d",&j,&k,&x,&p);
t=x%mo;
d=gcd(j,k);
t=(ll)t*qsm(j/d,mo-2)%mo*qsm(k/d,mo-2)%mo;
a[d]=t;
y=belong[d];
l=0;
fo(i,(y-1)*B+1,min(y*B,n)){
num[i]=(l+a[i])%mo;
l=num[i];
}
(l+=sum[y-1])%=mo;
l=(l-sum[y])%mo;
fo(i,y,belong[n]) (sum[i]+=l)%=mo;
ans=0;
i=1;
while (i<=p){
j=p/(p/i);
t=(getsum(j)-getsum(i-1))%mo;
(ans+=(ll)t*g[p/i]%mo)%=mo;
i=j+1;
}
(ans+=mo)%=mo;
printf("%d\n",ans);
}
}
0
0

* 以上用户言论只代表其个人观点，不代表CSDN网站的观点或立场
个人资料
• 访问：327189次
• 积分：11634
• 等级：
• 排名：第1512名
• 原创：814篇
• 转载：4篇
• 译文：0篇
• 评论：201条
最新评论
文章分类
评论排行