1 条题解
-
0
思路
32个正数在素数模下分半乘积统计,非零模元用逆元配对,重复输入按下标计数,目标1必须排除空集。
参考程序(C++11)
#include <bits/stdc++.h> using namespace std; long long modpow(long long a,long long e,long long p){long long z=1;while(e){if(e&1)z=z*a%p;a=a*a%p;e>>=1;}return z;}int main(){int n;long long p,c;cin>>n>>p>>c;vector<long long>a(n);for(auto &x:a)cin>>x;if(c>=p){cout<<0<<'\n';return 0;}vector<long long>l={1},r={1};for(int i=0;i<n;i++){auto &v=(i<n/2?l:r);int k=v.size();for(int j=0;j<k;j++)v.push_back(v[j]*a[i]%p);}sort(l.begin(),l.end());long long ans=0;for(long long x:r){long long target=c*modpow(x,p-2,p)%p;ans+=upper_bound(l.begin(),l.end(),target)-lower_bound(l.begin(),l.end(),target);}if(c==1)ans--;cout<<ans%1000000007<<'\n';}
- 1