日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JZOJ 4161. 于神之怒

發(fā)布時(shí)間:2025/3/15 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JZOJ 4161. 于神之怒 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Description

Input

一行三個(gè)數(shù),m, n, k。

Output

Sample Input

樣例1

3 3 2

樣例2

5000000 5000000 4000000

Sample Output

樣例1

20

樣例2

?913111630

Data Constraint

Solution

  • 直接上莫比烏斯反演:

Ans=i=1nj=1mgcd(i,j)kAns=∑i=1n∑j=1mgcd(i,j)k

Ans=ddki=1nj=1m[gcd(i,j)=d]Ans=∑ddk∑i=1n∑j=1m[gcd(i,j)=d]

Ans=ddki=1?nd?j=1?md?[gcd(i,j)=1]Ans=∑ddk∑i=1?nd?∑j=1?md?[gcd(i,j)=1]

Ans=ddki=1?nd?j=1?md?u|gcd(i,j)μ(u)Ans=∑ddk∑i=1?nd?∑j=1?md?∑u|gcd(i,j)μ(u)

  • 這一步是因?yàn)?#xff1a;

    d|nμ(d)=[n=1]∑d|nμ(d)=[n=1]

  • 于是我們繼續(xù)變換:

    Ans=ddkuμ(u)?ndu??mdu?Ans=∑ddk∑uμ(u)?ndu??mdu?

  • D=duD=du ,再將 DD 提到前面(這是為了湊形式):Ans=D?nD??mD?d|Ddk?μ(Dd)Ans=∑D?nD??mD?∑d|Ddk·μ(Dd)

  • 令單位冪函數(shù) idk(d)=dkidk(d)=dk ,那么有:

    Ans=D?nD??mD?f(D)Ans=∑D?nD??mD?f(D)

  • 其中:

    f(D)=d|Didk(d)?μ(Dd)f(D)=∑d|Didk(d)·μ(Dd)

  • 是狄利克雷卷積!即:f=idk?μf=idk?μ

  • 對于 ff 這個(gè)積性函數(shù),我們可以用線篩求出(跟篩 φφ 差不多)。

  • 之后做出前綴和就可以分塊求答案了。

  • 這種算法明顯優(yōu)于其它什么兩次分塊的算法,可以做多組詢問。

  • 就是提前給出 kk ,每次詢問給出一組 n,mn,m ,范圍還是 n,m,k5?106n,m,k≤5?106 ,詢問數(shù) T2000T≤2000

  • 那先預(yù)處理出 ff ,每次 O(n??)O(n) 回答詢問,時(shí)間復(fù)雜度 O(n+Tn??)O(n+Tn)

Code

#include<cstdio> #include<algorithm> #include<cctype> using namespace std; typedef long long LL; const int N=5e6+5,mo=1e9+7; int f[N],g[N]; bool bz[N]; inline int read() {int X=0,w=0; char ch=0;while(!isdigit(ch)) w|=ch=='-',ch=getchar();while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();return w?-X:X; } inline int ksm(int x,int y) {int s=1;while(y){if(y&1) s=(LL)s*x%mo;x=(LL)x*x%mo;y>>=1;}return s; } inline int min(int x,int y) {return x<y?x:y; } int main() {int n=read(),m=read(),k=read(),ans=0;g[1]=1;for(int i=2;i<N;i++){if(!bz[i]){f[++f[0]]=i;g[i]=ksm(i,k)-1;}for(int j=1;j<=f[0] && i*f[j]<N;j++){bz[i*f[j]]=true;if(i%f[j]==0){g[i*f[j]]=(LL)g[i]*(g[f[j]]+1)%mo;break;}g[i*f[j]]=(LL)g[i]*g[f[j]]%mo;}}for(int i=1;i<N;i++) g[i]=(g[i-1]+g[i])%mo;if(n>m) swap(n,m);for(int i=1,p;i<=n;i=p+1){p=min(n/(n/i),m/(m/i));ans=(ans+(LL)(n/p)*(m/p)%mo*(g[p]-g[i-1]+mo)%mo)%mo;}printf("%d\n",ans);return 0; }

總結(jié)

以上是生活随笔為你收集整理的JZOJ 4161. 于神之怒的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。