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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【UOJ #62】【UR #5】怎样跑得更快(莫比乌斯反演)

發布時間:2023/12/8 编程问答 58 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【UOJ #62】【UR #5】怎样跑得更快(莫比乌斯反演) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

傳送門

以下用C,DC,DC,D表示文內的c,dc,dc,d
顯然可以替換lcmlcmlcm后枚舉gcdgcdgcd得到
biiD≡∑d∣idC?D∑d∣j[gcd(id,jd)=1]xjjD\frac{b_i}{i^D}\equiv\sum_{d|i}d^{C-D}\sum_{d|j}[gcd(\frac i d,\frac j d)=1]x_jj^DiDbi??di?dC?Ddj?[gcd(di?,dj?)=1]xj?jD
bi=biiD,xj=xjjDb_i=\frac{b_i}{i^D},x_j=x_jj^Dbi?=iDbi??,xj?=xj?jD
bi≡∑d∣idC?D∑k∣idμ(k)∑dk∣jnxjb_i\equiv \sum_{d|i}d^{C-D}\sum_{k|\frac i d}\mu(k)\sum_{dk|j}^nx_jbi?di?dC?Dkdi??μ(k)dkjn?xj?
f(i)=∑d∣idC?Dμ(id)f(i)=\sum_{d|i}d^{C-D}\mu(\frac i d)f(i)=di?dC?Dμ(di?)
bi≡∑d∣if(d)∑d∣jnxjb_i\equiv \sum_{d|i}f(d)\sum_{d|j}^nx_jbi?di?f(d)djn?xj?
g(d)=∑d∣jnxjg(d)=\sum_{d|j}^nx_jg(d)=djn?xj?
bi≡∑d∣if(d)g(d)b_i\equiv \sum_{d|i}f(d)g(d)bi?di?f(d)g(d)
f(i)g(i)=bi?∑d∣i,d=?if(d)g(d)f(i)g(i)=b_i-\sum_{d|i,d\not=i}f(d)g(d)f(i)g(i)=bi??di,d?=i?f(d)g(d)
求出ggg后考慮
g(i)=∑i∣jnxjg(i)=\sum_{i|j}^nx_jg(i)=ijn?xj?
xi=g(i)?∑i∣j,i=?jxjx_i=g(i)-\sum_{i|j,i\not=j}x_jxi?=g(i)?ij,i?=j?xj?
復雜度O(nlogn)O(nlogn)O(nlogn)

#include<bits/stdc++.h> using namespace std; #define cs const #define re register #define pb push_back #define pii pair<int,int> #define ll long long #define fi first #define se second #define bg begin cs int RLEN=1<<20|1; inline char gc(){static char ibuf[RLEN],*ib,*ob;(ib==ob)&&(ob=(ib=ibuf)+fread(ibuf,1,RLEN,stdin));return (ib==ob)?EOF:*ib++; } inline int read(){char ch=gc();int res=0;bool f=1;while(!isdigit(ch))f^=ch=='-',ch=gc();while(isdigit(ch))res=(res+(res<<2)<<1)+(ch^48),ch=gc();return f?res:-res; } inline ll readll(){char ch=gc();ll res=0;bool f=1;while(!isdigit(ch))f^=ch=='-',ch=gc();while(isdigit(ch))res=(res+(res<<2)<<1)+(ch^48),ch=gc();return f?res:-res; } inline int readstring(char *s){int top=0;char ch=gc();while(isspace(ch))ch=gc();while(!isspace(ch)&&ch!=EOF)s[++top]=ch,ch=gc();return top; } template<typename tp>inline void chemx(tp &a,tp b){a<b?a=b:0;} template<typename tp>inline void chemn(tp &a,tp b){a>b?a=b:0;} cs int mod=998244353; inline int add(int a,int b){return (a+=b)>=mod?(a-mod):a;} inline int dec(int a,int b){a-=b;return a+(a>>31&mod);} inline int mul(int a,int b){static ll r;r=1ll*a*b;return (r>=mod)?(r%mod):r;} inline void Add(int &a,int b){(a+=b)>=mod?(a-=mod):0;} inline void Dec(int &a,int b){a-=b,a+=a>>31&mod;} inline void Mul(int &a,int b){static ll r;r=1ll*a*b;a=(r>=mod)?(r%mod):r;} inline int ksm(int a,int b,int res=1){if(a==0&&b==0)return 0;for(;b;b>>=1,Mul(a,a))(b&1)&&(Mul(res,a),1);return res;} inline int Inv(int x){return ksm(x,mod-2);} inline int fix(int x){return (x<0)?x+mod:x;} int n,q,c,d; cs int N=100005; int vis[N],pr[N],mu[N],tot,f[N],pc[N],pd[N]; inline void init_sieve(cs int n=N-5){mu[1]=1;for(int i=2;i<=n;i++){if(!vis[i])pr[++tot]=i,mu[i]=mod-1;for(int j=1;j<=tot&&i*pr[j]<=n;j++){vis[i*pr[j]]=1;if(i%pr[j]==0)break;mu[i*pr[j]]=mod-mu[i];}}for(int i=1;i<=n;i++)pc[i]=ksm(i,c),pd[i]=ksm(i,d);for(int i=1;i<=n;i++){int tp=mul(pc[i],Inv(pd[i]));for(int j=1;i*j<=n;j++)Add(f[i*j],mul(tp,mu[j]));} } int b[N],g[N],x[N]; int main(){#ifdef Stargazerfreopen("lx.in","r",stdin);#endifn=read(),c=read(),d=read(),q=read();init_sieve();while(q--){int fg=1;for(int i=1;i<=n;i++)b[i]=mul(read(),Inv(pd[i]));for(int i=1;i<=n;i++){if(!f[i]&&b[i]){fg=0;break;}g[i]=mul(Inv(f[i]),b[i]);for(int j=2;i*j<=n;j++)Dec(b[i*j],b[i]);}if(!fg){puts("-1");continue;}for(int i=n;i;i--){x[i]=g[i];for(int j=i+i;j<=n;j+=i)Dec(x[i],x[j]);}for(int i=1;i<=n;i++)cout<<mul(x[i],Inv(pd[i]))<<" ";puts("");}return 0; }

總結

以上是生活随笔為你收集整理的【UOJ #62】【UR #5】怎样跑得更快(莫比乌斯反演)的全部內容,希望文章能夠幫你解決所遇到的問題。

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