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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

2021牛客暑期多校训练营2 J-Product of GCDs(数论+计数)

發布時間:2023/12/3 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2021牛客暑期多校训练营2 J-Product of GCDs(数论+计数) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

J-Product of GCDs

Code1

對于每個質數以及每個質數的次冪單獨考慮他們的貢獻,由于多次使用快速冪導致TLE

#include<bits/stdc++.h> using namespace std; using ll=long long; template <class T=int> T rd() {T res=0;T fg=1;char ch=getchar();while(!isdigit(ch)) {if(ch=='-') fg=-1;ch=getchar();}while( isdigit(ch)) res=(res<<1)+(res<<3)+(ch^48),ch=getchar();return res*fg; }int prime[10000010],cnt,is[10000010]; void initP() {for(int i=2;i<=10000000;i++){if(!is[i]) prime[++cnt]=i;for(int j=1;prime[j]<=10000000/i;j++){is[prime[j]*i]=1;if(i%prime[j]==0) break;}} } int n,m; ll P,Phi; ll Cphi(ll v) {ll ans=v;for(int i=1;prime[i]<=v/prime[i];i++)if(v%prime[i]==0){ans=ans/prime[i]*(prime[i]-1);while(v%prime[i]==0) v/=prime[i];}if(v>1) ans=ans/v*(v-1);return ans; } const int N=8e4+10; ll C[N][35]; void mod(ll &v){if(v>=Phi) v-=Phi;} void initC() {for(int i=0;i<=n;i++){C[i][0]=1;for(int j=1;j<=min(i,m);j++){C[i][j]=C[i-1][j]+C[i-1][j-1],mod(C[i][j]);}} } ll mul(ll a,ll b){return(__int128)a*b%P;} ll qmi(ll a,ll b) {ll v=1;while(b){if(b&1) v=mul(v,a);b>>=1;a=mul(a,a);}return v; } int a[N]; int main() {initP();int Tc=rd();while(Tc--){n=rd(),m=rd(),P=rd<ll>(),Phi=Cphi(P);initC();for(int i=1;i<=n;i++) a[i]=rd();ll ans=1;for(int p=1;p<=8000;p++){static int b[N];for(int i=1;i<=n;i++) b[i]=0;for(int i=1;i<=n;i++) while(a[i]%prime[p]==0) a[i]/=prime[p],b[i]++;// 桶排序static int c[30];memset(c,0,sizeof c);int maxn=*max_element(b+1,b+1+n);if(maxn==0) continue;for(int i=1;i<=n;i++) c[b[i]]++;int cnt=0;for(int i=1;i<=maxn;i++) while(c[i]--) b[++cnt]=i;for(int i=1;i<=cnt;i++){ll pw=C[cnt-i][m-1];ans=mul(ans,qmi(qmi(prime[p],pw),b[i]));}}printf("%lld\n",ans);} }

Code2

考慮分質因子統計,計算f(p,c)f_{(p,c)}f(p,c)?表示至少包含 pcp^cpc 的數個數,方案數為
(f(p,c)k)\begin{pmatrix} f_{(p,c)}\\ k \end{pmatrix}(f(p,c)?k?)

注意需要計算得到的實際上是指數,因此我們需要對于𝜑(𝑷) 取模
(擴展)歐拉定理學習筆記

好像很多同學關心加不加phi的問題,,我發現歐拉降冪挺多題其實都沒故意卡這點也就是記住對𝜑(𝑷)取模即可~

通過分解質因數暴力求𝜑(𝑷)即可,只需要預處理√𝑃 內的質數,復雜度為𝑂(√𝑃+𝑇 √𝑃/(𝑙𝑜𝑔 𝑃))
𝜑(𝑷)不是質數,但是鑒于𝑘較小,組合數直接𝑂(𝑛𝑘)遞推即可(為此 𝑛 開得比較小)

#include<bits/stdc++.h>using namespace std; using ll=long long; template <class T=int> T rd() {T res=0;char ch=getchar();while(!isdigit(ch)) ch=getchar();while( isdigit(ch)) res=(res<<1)+(res<<3)+(ch^48),ch=getchar();return res; }int prime[10000010],cnt,is[10000010]; void initP() {for(int i=2;i<=10000000;i++){if(!is[i]) prime[++cnt]=i;for(int j=1;prime[j]<=10000000/i;j++){is[prime[j]*i]=1;if(i%prime[j]==0) break;}} } int n,m; ll P,Phi; ll Cphi(ll v) {ll ans=v;for(int i=1;prime[i]<=v/prime[i];i++)if(v%prime[i]==0){ans=ans/prime[i]*(prime[i]-1);while(v%prime[i]==0) v/=prime[i];}if(v>1) ans=ans/v*(v-1);return ans; } const int N=8e4+10; ll C[N][35]; void mod(ll &v){if(v>=Phi) v-=Phi;} void initC() {for(int i=0;i<=n;i++){C[i][0]=1;for(int j=1;j<=min(i,m);j++){C[i][j]=C[i-1][j]+C[i-1][j-1],mod(C[i][j]);}} } ll mul(ll a,ll b){return(__int128)a*b%P;} ll qmi(ll a,ll b) {ll v=1;while(b){if(b&1) v=mul(v,a);b>>=1;a=mul(a,a);}return v; } int a[N]; int main() {initP();int Tc=rd();while(Tc--){n=rd(),m=rd(),P=rd<ll>(),Phi=Cphi(P);initC();memset(a,0,sizeof a);for(int i=1;i<=n;i++) a[rd()]++;ll ans=1;for(int p=1;p<=8000;p++){ll res=0;for(int i=prime[p];i<N;i*=prime[p]){int c=0;for(int j=i;j<N;j+=i) c+=a[j];if(c<m) break;res+=C[c][m],mod(res);if(1ll*i*prime[p]>=N) break;}if(res) ans=mul(ans,qmi(prime[p],res));}printf("%lld\n",ans);} }

總結

以上是生活随笔為你收集整理的2021牛客暑期多校训练营2 J-Product of GCDs(数论+计数)的全部內容,希望文章能夠幫你解決所遇到的問題。

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