題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=6706
題目大意:給定n,a,b,保證a,b互質,
計算f(n,a,b)=∑i=1n∑j=1igcd(ia−ja,ib−jb)[gcd(i,j)=1]%(109+7)。
題解:
因爲a>b且gcd(a,b)=1,則有gcd(an−bn,am−bm)=agcd(n,m)−bgcd(n,m)。
證明 :
假設:n>=m,r=n%m
有an−bn=(am−bm)∗(an−m+an−2mbm+⋯+arbn−m−r)+arbn−r−bn
gcd(an−bn,am−bm)=gcd(arbn−r−bn,am−bm)=gcd(bn−r∗(ar−br),am−bm)
設bn−r=bm⌊mn⌋=bkm
考慮gcd(bkm,am−bm)
有bkm=(am−bm)∗(−b(k−1)m−amb(k−2)m−⋯−a(k−1)m)+akm
gcd(bkm,am−bm)=gcd(akm,am−bm)=d
所以d∣bkm,d∣akm,d∣gcd(bkm,akm)=1
即gcd(bn−r,am−bm)=1
所以gcd(an−bn,am−bm)=gcd(an%m−bn%m,am−bm)=agcd(n,m)−bgcd(n,m)
證畢。
那麼題目:
f(n,a,b)
=∑i=1n∑j=1igcd(ia−ja,ib−jb)[gcd(i,j)=1]
=∑i=1n∑j=1i(i−j)[gcd(i,j)=1]
=∑i=1n∑j=1ii[gcd(i,j)=1]−∑i=1n∑j=1ij[gcd(i,j)=1]
=∑i=1ni∗ϕ(i)−∑i=1n(2i∗ϕ(i)+[i==1])
=2∑i=1ni∗ϕ(i)−1
由杜教篩公式:S(n)∗g(1)=∑i=1n(f∗g)(i)−∑i=2ng(i)S(in)
這時候我們就可以通過構造f(n)=n∗ϕ(n),S(n)=∑i=1nf(i),g(n)=id(n)作狄利克雷卷積杜教篩即可
(f∗g)(n)=∑d∣nn∗ϕ(d)=n∑d∣nϕ(d)=n2
最終杜教篩的公式:S(n)=∑i=1ni2−∑i=2ni∗S(in),前一部分直接算,後一部分可以用分塊求和做就ok了。
AC代碼:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=1e9+7;
int qpow(int x,int y)
{
int ans=1;
while(y>0){
if(y&1){
ans=(ll)ans*x%mod;
}
x=(ll)x*x%mod;
y>>=1;
}
return ans;
}
const int maxn=1e6+10;
bool vis[maxn];
int tot=0,phi[maxn],prime[maxn];
int s[maxn];
void calphi()
{
phi[1]=1;
for(int i=2;i<maxn;i++){
if(!vis[i]){
prime[tot++]=i;
phi[i]=i-1;
}
for(int j=0;j<tot;j++){
if(i*prime[j]>maxn){ break;}
vis[i*prime[j]]=1;
if(i%prime[j]==0){
phi[i*prime[j]]=phi[i]*prime[j];
break;
}
else{
phi[i*prime[j]]=phi[i]*(prime[j]-1);
}
}
}
s[0]=0;
for(int i=1;i<maxn;i++){
s[i]=(ll)(s[i-1]+(ll)i*phi[i]%mod)%mod;
}
}
int inv_2,inv_6;
unordered_map<int,int>ard;
int solve(int n)
{
if(n<maxn){
return s[n];
}
if(ard[n]){
return ard[n];
}
int ans=(ll)n*(n+1)%mod*(2*n%mod+1)%mod*inv_6%mod;
int l=2,r=n;
while(l<=n){
r=(n/(n/l));
ans=(ans-(ll)(l+r)*(r-l+1)%mod*inv_2%mod*solve(n/l)%mod+mod)%mod;
l=r+1;
}
ard[n]=ans;
return ans;
}
int main()
{
int t;
scanf("%d",&t);
calphi();
int a,b;
int n;
inv_2=qpow(2,mod-2);
inv_6=qpow(6,mod-2);
while(t--){
scanf("%d%d%d",&n,&a,&b);
int ans=(ll)((solve(n)-1)%mod+mod)%mod*inv_2%mod;
printf("%d\n",ans);
}
return 0;
}
杜教篩參考:https://www.cnblogs.com/peng-ym/p/9446555.html
參考:https://www.cnblogs.com/danzh/p/11405721.html