1. 程式人生 > >[Noip模擬題]統計方案

[Noip模擬題]統計方案

題目並不難,想一下就會了,我真的智商持續下降,取模情況下做除法我都沒想到逆元。
總之想到逆元就好寫了,還是\(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);}