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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

51nod-猴猴吃香蕉【dp】

發布時間:2023/12/3 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 51nod-猴猴吃香蕉【dp】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

正題

題目鏈接:https://www.51nod.com/Contest/Problem.html#contestProblemId=1149


題目大意

nnn個數,求有多少種選擇方案使選擇的數乘機為kkk


解題思路

顯然kkk的質因數最多只有999個,我們將質因數進行dpdpdp。若選擇的數的質因數剛好是kkk的質因數,那么就可以。

為了方便我們將狀態壓成一維的即可。


codecodecode

#include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; const ll N=1100,XJQ=1e9+7; struct node{ll w,v; }q[N]; bool cmp(node x,node y) {return x.w<y.w;} ll n,K,v[N],sum[N],f[N*N],T,cnt,two; void dfs(ll x,ll s,ll zs) {if(x>cnt){(f[zs]+=f[s])%=XJQ;return;}for(ll i=q[x].v-v[x];i>=0;i--)dfs(x+1,s+sum[x-1]*i,zs+sum[x-1]*(i+v[x])); } int main() {scanf("%lld",&T);while(T--){scanf("%lld%lld",&n,&K);cnt=0;for(ll i=2;i*i<=K;i++){if(!(K%i)){q[++cnt].w=i;q[cnt].v=0;while(!(K%i))q[cnt].v++,K/=i;}}if(K!=1) q[++cnt].w=K,q[cnt].v=1;sort(q+1,q+1+cnt,cmp);memset(f,0,sizeof(f));f[0]=sum[0]=two=1;for(ll i=1;i<=cnt;i++)sum[i]=sum[i-1]*(q[i].v+1);for(ll i=1;i<=n;i++){ll x=0,z=0,l=0,r=1;bool flag=0;scanf("%lld",&x);if(x==1){two=two*2%XJQ;continue;}memset(v,0,sizeof(v));for(ll j=2;j*j<=x;j++){if(!(x%j)){while(q[l].w<j) r*=v[l],l++;if(q[l].w!=j){flag=1;break;}while(!(x%j))x/=j,v[l]+=(q[l].w==j);if(v[l]>q[l].v){flag=1;break;}}}if(flag) continue;if(x!=1){for(l=0,r=1;q[l].w<x;r*=v[l],l++);if(q[l].w==x)v[l]++;}dfs(1,0,0);}printf("%lld\n",(f[sum[cnt]-1]*two)%XJQ);} }

總結

以上是生活随笔為你收集整理的51nod-猴猴吃香蕉【dp】的全部內容,希望文章能夠幫你解決所遇到的問題。

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