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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【bzoj3309】DZY Loves Math 莫比乌斯反演+线性筛

發布時間:2025/5/22 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【bzoj3309】DZY Loves Math 莫比乌斯反演+线性筛 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Description

對于正整數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 4451211
7425644 1189442
6335198 4957

Sample Output

35793453939901
14225956593420
4332838845846
15400094813

HINT

T<=10000
1<=a,b<=10^7

sol

先推式子,假設a<b,枚舉gcd:

\(ans=\sum_{i=1}^{a}\sum_{j=1}^f(i,j)\)

\(=\sum_{d=1}^{a}f(d)\sum_{i=1}^{\lfloor\frac{a}ozvdkddzhkzd\rfloor}\sum_{j=1}^{\lfloor\fracozvdkddzhkzd\rfloor}[(i,j)=1]\)

\(=\sum_{d=1}^{a}f(d)\sum_{i=1}^{\lfloor\frac{a}ozvdkddzhkzd\rfloor}\mu(i)\lfloor\frac{a}{id}\rfloor\lfloor\frac{id}\rfloor\)

\(=\sum_{T=1}^{a}\lfloor\frac{a}{T}\rfloor\lfloor\frac{T}\rfloor\sum_{d|T}f(d)\mu(\frac{T}ozvdkddzhkzd)\)

前面那個玩意直接數論分塊就可以了,然后分析后面的式子:

我們只考慮沒有平方因子的T/d,那么此時f(d)的取值只有兩種:T最高次質因數冪-1或者T最高次質因數冪。

如果取的是最高次質因數冪,那么我們發現,T/d中剩下的數字次數可以是0也可以是1,那么根據莫比烏斯函數的定義,\(\mu(\frac{T}ozvdkddzhkzd)\)一定等于0,不會產生任何貢獻。

如果取的是最高次質因數冪-1,那么我們發現,滿足最高次冪的指數在T/d中都是1次項,其他數字隨意,根據莫比烏斯函數的定義,mu一定是0,不會產生任何貢獻。

所以現在只剩下了兩種情況:1.質數2.d中所有次冪都相等

線性篩即可,線性篩處理出每個數字最高次質因數冪和最高次質因數冪的乘積,便可以在線性篩中直接判斷。

code

#include <bits/stdc++.h> using namespace std; int g[10000007],a[10000007],pri[10000007],vis[10000007],sum[10000007],ma[10000007],T,n,m,tot; long long cal(int a,int b) {if(a>b) swap(a,b);long long ans=0;for(int i=1,last=0;i<=a;i=last+1) last=min(a/(a/i),b/(b/i)),ans+=1ll*(a/i)*(b/i)*(sum[last]-sum[i-1]);return ans; } int main() {for(int i=2;i<=1e7;i++){if(!vis[i]){pri[++tot]=i;g[i]=1,a[i]=1;ma[i]=i;}for(int j=1,k;j<=tot&&(k=i*pri[j])<=1e7;j++){vis[k]=1;if(i%pri[j]==0){a[k]=a[i]+1;ma[k]=ma[i]*pri[j];if(i==ma[i]) g[k]=1;else g[k]=(a[i/ma[i]]==a[k]?-g[i/ma[i]]:0);}else a[k]=1,ma[k]=pri[j],g[k]=(a[i]==1?-g[i]:0);}sum[i]=sum[i-1]+g[i];}for(scanf("%d",&T);T--;printf("%lld\n",cal(n,m))) scanf("%d%d",&n,&m); }

轉載于:https://www.cnblogs.com/CK6100LGEV2/p/9393077.html

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的【bzoj3309】DZY Loves Math 莫比乌斯反演+线性筛的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。