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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

[UOJ62]怎样跑得更快

發布時間:2024/1/17 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [UOJ62]怎样跑得更快 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

以下用等號代替同余

這個式子是$\sum\limits_{j=1}^n(i,j)^{c-d}i^dj^dx_j=b_i$

令$g(n)=\sum\limits_{e|n}\mu\left(\frac ne\right)e^{c-d}$,那么原式變為$\sum\limits_{e|i}g(e)\sum\limits_{\substack{e|j\\1\leq j\leq n}}j^dx_j=\frac{b_i}{i^d}$

令$z_e=\sum\limits_{\substack{e|j\\1\leq j\leq n}}j^dx_j$,先處理原式

$\sum\limits_{e|i}g(e)z_e=\frac{b_i}{i^d}\Leftrightarrow g(i)z_i=\sum\limits_{e|i}\mu\left(\frac ie\right)\frac{b_e}{e^d}$

$g(i)$和上式右邊都可以$O(n\log n)$預處理,此時如果存在$i$使$g(i)=0$且右邊$\ne0$那么無解,兩個都是$0$就多解,隨便給$z_i$賦值即可

最后求$x_i$:$x_ii^d=\sum\limits_{\substack{i|j\\1\leq j\leq n}}\mu\left(\frac ji\right)z_j$

正如vfk的題解所說:三個莫比烏斯反演擲地有聲==

寫快速冪時要注意負指數的處理...

#include<stdio.h> #include<string.h> char s[4000000]; int ns; #define NUM(x) ('0'<=x&&x<='9') inline int rd(){while(!NUM(s[ns]))ns++;int x=0;while(NUM(s[ns]))x=x*10+s[ns++]-'0';return x; } typedef long long ll; const int mod=998244353,T=100000; int mul(int a,int b){return(ll)a*b%mod;} void inc(int&a,int b){(a+=b)%=mod;} int pow(int a,int b){int s=1;while(b<0)b+=mod-1;while(b){if(b&1)s=mul(s,a);a=mul(a,a);b>>=1;}return s; } int pr[T+10],mu[T+10],nd[T+10],d; bool np[T+10]; void sieve(){int i,j,M=0;mu[1]=1;nd[1]=1;for(i=2;i<=T;i++){if(!np[i]){pr[++M]=i;mu[i]=-1;nd[i]=pow(i,-d);}for(j=1;j<=M&&i*pr[j]<=T;j++){np[i*pr[j]]=1;nd[i*pr[j]]=mul(nd[i],nd[pr[j]]);if(i%pr[j]==0)break;mu[i*pr[j]]=-mu[i];}} } int b[T+10],g[T+10],h[T+10],n,c; int main(){fread(s,1,4000000,stdin);int q,i,j,t;n=rd();c=rd();d=rd();q=rd();sieve();for(i=1;i<=n;i++){t=pow(i,c-d);for(j=1;i*j<=n;j++)inc(g[i*j],mu[j]*t);}for(i=1;i<=n;i++)g[i]=pow(g[i],mod-2);while(q--){for(i=1;i<=n;i++)b[i]=mul(rd(),nd[i]);memset(h,0,sizeof(h));for(i=1;i<=n;i++){t=b[i];for(j=1;i*j<=n;j++){if(mu[j])inc(h[i*j],mu[j]*t);}}for(i=1;i<=n;i++){if(g[i]==0&&h[i]!=0){i=-1;break;}h[i]=mul(h[i],g[i]);}if(i==-1){puts("-1");continue;}for(i=1;i<=n;i++){t=0;for(j=1;i*j<=n;j++)inc(t,mu[j]*h[i*j]);t=mul(nd[i],t);inc(t,mod);printf("%d ",t);}putchar('\n');} }

轉載于:https://www.cnblogs.com/jefflyy/p/9607956.html

總結

以上是生活随笔為你收集整理的[UOJ62]怎样跑得更快的全部內容,希望文章能夠幫你解決所遇到的問題。

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