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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

nssl1176-轨道【数论,Dp】

發布時間:2023/12/3 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 nssl1176-轨道【数论,Dp】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

正題


題目大意

給出n,m,kn,m,kn,m,k
v=∏i=1nai(ai∈N+,ai&lt;=m)k(gcd(v,k)=1)v=\frac{\prod_{i=1}^na_i(a_i\in N_+,a_i&lt;=m)}{k}(gcd(v,k)=1)v=ki=1n?ai?(ai?N+?,ai?<=m)?(gcd(v,k)=1)
aaa的方案個數mod10007mod\ 10007mod?10007的值


解題思路

fi,jf_{i,j}fi,j?表示前i個數的乘積和k的最大公約數為k的第j個約數時的方案個數。
動態轉移方程:
fi,j=∑k=1prcj%prck=0fi?1,k?f1,prcnprcj/prckf_{i,j}=\sum_{k=1}^{prc_j\%prc_k=0}f_{i-1,k}*f_{1,prcn_{prc_j/prc_k}}fi,j?=k=1prcj?%prck?=0?fi?1,k??f1,prcnprcj?/prck???
prciprc_iprci?為k的第i個約數,prcniprcn_iprcni?為i是k的第幾個約數。
然后我們考慮如何求出1~m1\sim m1m內有多少個數與k的最大公約數為k的第i個約數
也就是∑i=1m(gcd(i,k)==d)(d∣n)\sum_{i=1}^m (gcd(i,k)==d)(d|n)i=1m?(gcd(i,k)==d)(dn)
首先
gcd(i,k)=d?gcd(i/d,k)=1gcd(i,k)=d\Rightarrow gcd(i/d,k)=1gcd(i,k)=d?gcd(i/d,k)=1(數論基礎)
我們可以考慮用容斥,我們將重復偶數次的減去,重復奇數次的加上。
之后預處理一下prcimodprcj==0prc_i\ \ mod\ \ prc_j==0prci???mod??prcj?==0的情況就好了。


code

#pragma GCC optimize(2) %:pragma GCC optimize(3) %:pragma GCC optimize("Ofast") %:pragma GCC optimize("inline") %:pragma GCC optimize("-fgcse") %:pragma GCC optimize("-fgcse-lm") %:pragma GCC optimize("-fipa-sra") %:pragma GCC optimize("-ftree-pre") %:pragma GCC optimize("-ftree-vrp") %:pragma GCC optimize("-fpeephole2") %:pragma GCC optimize("-ffast-math") %:pragma GCC optimize("-fsched-spec") %:pragma GCC optimize("unroll-loops") %:pragma GCC optimize("-falign-jumps") %:pragma GCC optimize("-falign-loops") %:pragma GCC optimize("-falign-labels") %:pragma GCC optimize("-fdevirtualize") %:pragma GCC optimize("-fcaller-saves") %:pragma GCC optimize("-fcrossjumping") %:pragma GCC optimize("-fthread-jumps") %:pragma GCC optimize("-funroll-loops") %:pragma GCC optimize("-fwhole-program") %:pragma GCC optimize("-freorder-blocks") %:pragma GCC optimize("-fschedule-insns") %:pragma GCC optimize("inline-functions") %:pragma GCC optimize("-ftree-tail-merge") %:pragma GCC optimize("-fschedule-insns2") %:pragma GCC optimize("-fstrict-aliasing") %:pragma GCC optimize("-fstrict-overflow") %:pragma GCC optimize("-falign-functions") %:pragma GCC optimize("-fcse-skip-blocks") %:pragma GCC optimize("-fcse-follow-jumps") %:pragma GCC optimize("-fsched-interblock") %:pragma GCC optimize("-fpartial-inlining") %:pragma GCC optimize("no-stack-protector") %:pragma GCC optimize("-freorder-functions") %:pragma GCC optimize("-findirect-inlining") %:pragma GCC optimize("-fhoist-adjacent-loads") %:pragma GCC optimize("-frerun-cse-after-loop") %:pragma GCC optimize("inline-small-functions") %:pragma GCC optimize("-finline-small-functions") %:pragma GCC optimize("-ftree-switch-conversion") %:pragma GCC optimize("-foptimize-sibling-calls") %:pragma GCC optimize("-fexpensive-optimizations") %:pragma GCC optimize("-funsafe-loop-optimizations") %:pragma GCC optimize("inline-functions-called-once") %:pragma GCC optimize("-fdelete-null-pointer-checks") #include<cstdio> #include<cmath> #include<algorithm> #define BPM 10007 #define N 4010 using namespace std; int n,m,k,frct,prit,fft[N],sum,m1; int pri[N],frc[N],ff[N][N],ys[10000001],f[N][N]; void dfs(int x,int zf,int ans)//容斥 {if(x>prit) {sum+=m1/ans*zf;return;}dfs(x+1,zf,ans);dfs(x+1,-zf,ans*pri[x]); } int main() {scanf("%d%d%d",&n,&m,&k);int sk=sqrt(k);for(int i=1;i<=sk;i++){if(k%i==0){frc[++frct]=i;if(k/i>sk) frc[++frct]=k/i;}}//求約數sort(frc+1,frc+1+frct);int tmp=k;for(int i=2;i<=sk;i++){if(tmp==1) break;if(tmp%i==0){pri[++prit]=i;while(tmp%i==0) tmp/=i;}}//求質因子if(tmp!=1) pri[++prit]=tmp;sort(pri+1,pri+tmp+1);for(int i=1;i<=frct;i++){ys[frc[i]]=i;sum=0;m1=m/frc[i];dfs(1,1,1);f[1][i]=sum%BPM;}//計算f[1]for(int i=1;i<=frct;i++)for(int j=1;j<=i;j++)if(frc[i]%frc[j]==0)ff[i][++fft[i]]=j;//預處理關系for(int i=2;i<=n;i++)for(int j=1;j<=frct;j++){if(!fft[j]) continue;for(int k=1;k<=fft[j];k++)f[i][j]=(f[i][j]+f[i-1][ff[j][k]]*f[1][ys[frc[j]/frc[ff[j][k]]]])%BPM;//動態轉移}printf("%d",f[n][frct]); }

總結

以上是生活随笔為你收集整理的nssl1176-轨道【数论,Dp】的全部內容,希望文章能夠幫你解決所遇到的問題。

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