[Noip模擬題]統計方案
阿新 • • 發佈:2018-11-09
題目並不難,想一下就會了,我真的智商持續下降,取模情況下做除法我都沒想到逆元。
總之想到逆元就好寫了,還是\(meet\ in\ the\ middle\)裸題,陣列開不下用\(hash/map\)存一下就好了.
提示:
1、特判\(c==1\)的情況
2、特判\(c>=p\)的情況
#include<cstdio> #include<map> int n,p,c,mod=1e9+7,a[40],ans;std::map<int,int>mp; int mi(int a,int b){int ans=1;while(b){if(b&1)ans=(1ll*ans*a)%p;b>>=1;a=(1ll*a*a)%p;}return ans;} void dfs(int x,int now){ if(x>n/2){mp[now]++;return ;} dfs(x+1,1ll*now*a[x]%p),dfs(x+1,now);} void dfs1(int x,int now){ if(x>n){int b=1ll*c*mi(now,p-2)%p;ans=(ans+mp[b])%mod;return ;} dfs1(x+1,1ll*now*a[x]%p),dfs1(x+1,now);} int main(){ scanf("%d%d%d",&n,&p,&c);for(int i=1;i<=n;i++)scanf("%d",&a[i]); if(c>=p){printf("0\n");return 0;} dfs(1,1),dfs1(n/2+1,1);printf("%d\n",c!=1?ans:ans-1);}