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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【SDOI2014】数表【莫比乌斯反演】【树状数组】

發(fā)布時間:2023/12/3 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【SDOI2014】数表【莫比乌斯反演】【树状数组】 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

傳送門

傳送門

題意:

TTT組詢問給定n,m,an,m,an,m,a,求

∑i=1N∑j=1M[(∑d∈N?[d∣i][d∣j]d)≤a]∑d∈N?[d∣i][d∣j]d\sum_{i=1}^{N}\sum_{j=1}^{M}[(\sum_{d \in N^*}[d\mid i][d \mid j]d)\leq a]\sum_{d \in N^*}[d\mid i][d \mid j]di=1N?j=1M?[(dN??[di][dj]d)a]dN??[di][dj]d

1≤n,m≤1e5,1≤a≤1e9,1≤T≤2e41 \leq n,m \leq 1e5,1 \leq a \leq1e9,1 \leq T \leq2e41n,m1e5,1a1e9,1T2e4

2312^{31}231取模

反演神題

假設(shè)沒有前面的限制

∑i=1N∑j=1M∑d∈N?[d∣i][d∣j]\sum_{i=1}^{N}\sum_{j=1}^{M}\sum_{d \in N^*}[d\mid i][d \mid j]i=1N?j=1M?dN??[di][dj]

F(x)F(x)F(x)表示約數(shù)和

∑i=1N∑j=1MF(gcd(i,j))\sum_{i=1}^N\sum_{j=1}^{M}F(gcd(i,j))i=1N?j=1M?F(gcd(i,j))

套路性地枚舉gcdgcdgcd

∑d∑i=1N∑j=1M[gcd(i,j)=d]F(d)\sum_ozvdkddzhkzd\sum_{i=1}^N\sum_{j=1}^{M}[gcd(i,j)=d]F(d)d?i=1N?j=1M?[gcd(i,j)=d]F(d)

套路性地提到前面

∑dF(d)∑i=1n∑j=1m[gcd(i,j)=d]\sum_ozvdkddzhkzdF(d)\sum_{i=1}^n\sum_{j=1}^{m}[gcd(i,j)=d]d?F(d)i=1n?j=1m?[gcd(i,j)=d]

后面是個套路性的反演

設(shè)

f(d)=∑i=1N∑j=1M[gcd(i,j)=d]f(d)=\sum_{i=1}^N\sum_{j=1}^{M}[gcd(i,j)=d]f(d)=i=1N?j=1M?[gcd(i,j)=d]

g(d)=∑d∣nf(n)=?Nd??Md?g(d)=\sum_{d\mid n}f(n)=\lfloor\frac{N}ozvdkddzhkzd\rfloor\lfloor\frac{M}ozvdkddzhkzd\rfloorg(d)=dn?f(n)=?dN???dM??

f(d)=∑d∣ng(n)μ(nd)=∑d∣n?Nn??Mn?μ(nd)f(d)=\sum_{d\mid n}g(n)\mu(\frac{n}ozvdkddzhkzd)=\sum_{d \mid n}\lfloor\frac{N}{n}\rfloor\lfloor\frac{M}{n}\rfloor\mu(\frac{n}ozvdkddzhkzd)f(d)=dn?g(n)μ(dn?)=dn??nN???nM??μ(dn?)

代回去

∑dF(d)∑d∣n?Nn??Mn?μ(nd)\sum_ozvdkddzhkzdF(d)\sum_{d \mid n}\lfloor\frac{N}{n}\rfloor\lfloor\frac{M}{n}\rfloor\mu(\frac{n}ozvdkddzhkzd)d?F(d)dn??nN???nM??μ(dn?)

∑n=1min(N,M)?Nn??Mn?∑d∣nF(d)μ(nd)\sum_{n=1}^{min(N,M)}\lfloor\frac{N}{n}\rfloor\lfloor\frac{M}{n}\rfloor\sum_{d\mid n}F(d)\mu(\frac{n}ozvdkddzhkzd)n=1min(N,M)??nN???nM??dn?F(d)μ(dn?)

左邊是個套路性的整除分塊 不管

右邊并沒有很好的性質(zhì),只能篩出來暴力求……

等下,原題是有限制F(d)≤aF(d)\leq aF(d)a

設(shè)

G(n)=∑d∣nF(d)μ(nd)G(n)=\sum_{d\mid n}F(d)\mu(\frac{n}ozvdkddzhkzd)G(n)=dn?F(d)μ(dn?)

我們發(fā)現(xiàn)只有不超過aaaF(d)F(d)F(d)才對答案有貢獻(xiàn)

T,NT,NT,N都很小

所以可以把F(d)F(d)F(d)aaa排個序,拿個指針指一下

跑到一個aaa把前面的F(d)F(d)F(d)枚舉倍數(shù)統(tǒng)計(jì)更新GGG,再拿整除分塊算答案

需要維護(hù)單點(diǎn)加,區(qū)間詢問,用個樹狀數(shù)組即可

復(fù)雜度大概O(NlogN+TlogTT)O(NlogN+TlogT\sqrt{T})O(NlogN+TlogTT?)

#include <iostream> #include <cstdio> #include <cstring> #include <cctype> #include <algorithm> #define MAXN 100005 using namespace std; const int N=100000; int np[MAXN],pl[MAXN],cnt; int mu[MAXN],f[MAXN],mp[MAXN],pt[MAXN]; inline int qpow(int a,int p) {int ans=1;while (p){if (p&1) ans*=a;a*=a;p>>=1;}return ans; } void init() {np[1]=mu[1]=f[1]=1;for (int i=2;i<=N;++i){if (!np[i]){pl[++cnt]=i;mu[i]=-1;mp[i]=i;pt[i]=1;}int x;for (int j=1;(x=i*pl[j])<=N;++j){np[x]=1;mp[x]=pl[j];if (i%pl[j]==0){mu[x]=0;pt[x]=pt[i]+1;break;}mu[x]=-mu[i];pt[x]=1;}}for (int i=2;i<=N;i++){int t=qpow(mp[i],pt[i]);if (i==t) f[i]=f[i/mp[i]]+t;else f[i]=f[t]*f[i/t];} } int p[MAXN]; inline bool cmp(const int& a,const int& b){return f[a]<f[b];} struct query{int n,m,a,id;}q[MAXN]; inline bool operator <(const query& x,const query& y){return x.a<y.a;} struct BIT {int s[MAXN];inline int lowbit(const int& x){return x&-x;}inline void modify(int x,const int& v){for (;x<=N;s[x]+=v,x+=lowbit(x));}inline int query(int x){int ans=0;for (;x;ans+=s[x],x-=lowbit(x));return ans;} }g; int res[MAXN]; //int calc(int x,int y,int a) //{ // int ans=0; // for (int i=1;i<=x&&i<=y;i++) // if (x%i==0&&y%i==0) // ans+=i; // if (ans<=a) return ans; // else return 0; //} int main() {init();for (int i=1;i<=N;i++) p[i]=i;sort(p+1,p+N+1,cmp);int pos=0;int T;scanf("%d",&T);for (int i=1;i<=T;i++) {scanf("%d%d%d",&q[i].n,&q[i].m,&q[i].a);q[i].id=i; // int t=0; // for (int x=1;x<=q[i].n;x++) // for (int y=1;y<=q[i].m;y++) // t+=calc(x,y,q[i].a); // printf("%d\n",t&(~(1<<31)));}sort(q+1,q+T+1);for (int i=1;i<=T;i++){while (pos<N&&f[p[pos+1]]<=q[i].a){++pos;for (int d=1;d*p[pos]<=N;++d) g.modify(d*p[pos],f[p[pos]]*mu[d]);}if (q[i].n>q[i].m) swap(q[i].n,q[i].m);int ans=0;for (int l=1,r;l<=q[i].n;l=r+1){r=min(q[i].n/(q[i].n/l),q[i].m/(q[i].m/l));ans+=(q[i].n/l)*(q[i].m/l)*(g.query(r)-g.query(l-1));}res[q[i].id]=ans;}for (int i=1;i<=T;i++) printf("%d\n",res[i]&(~(1<<31)));return 0; }

總結(jié)

以上是生活随笔為你收集整理的【SDOI2014】数表【莫比乌斯反演】【树状数组】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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