1 条题解
-
1
推了好久的莫反柿子炸了 讨厌T^T一个题解
若只放体积为的物品,则能得到的重量满足使得。
根据裴蜀定理 。
对于多个数同理。
那么我们现在所求的内容就是,为某个数因数的子集个数。
我们可以求出的所有因数,只在它的这些因数上考虑。
我认为最困难的是想到。记表示考虑了的前个因数,组成的为的第个因数的子集个数。
转移也是容易的。
对于每个询问,设是的第个因数,记为的第个因数,为的因数个数,答案为。
对于每个都可以预处理,复杂度,总复杂度。
#include<bits/stdc++.h> using namespace std; #define int long long #define pii pair<int,int> #define F first #define S second #define mkp make_pair #define psb push_back const int mod=1e9+7; int n,Q,P; int sons[101000],stot; unordered_map<int,int>mp; int cnt[101000]; int dp[2552][2552],f2[1010000]; int ans[101000]; signed main(){ ios::sync_with_stdio(0); cin.tie(0); // system("fc my.out ex.out");return 0; // freopen("ex.in","r",stdin); // freopen("my.out","w",stdout); cin>>n>>Q>>P; for(int i=1;i<=sqrt(P);i++){ if(P%i==0){ sons[++stot]=i; if(i*i!=P) sons[++stot]=P/i; } }sort(sons+1,sons+1+stot); for(int i=1;i<=stot;i++){ mp[sons[i]]=i; } for(int i=1;i<=n;i++){ int x;cin>>x; x=__gcd(x,P); cnt[mp[x]]++; }dp[0][stot]=1; f2[0]=1; for(int i=1;i<=n;i++)f2[i]=f2[i-1]*2%mod; for(int i=1;i<=stot;i++){ for(int j=1;j<=stot;j++){ dp[i][j]=dp[i-1][j]; int to=mp[__gcd(sons[i],sons[j])]; dp[i][to]=(dp[i][to]+(dp[i-1][j])*(f2[cnt[i]]-1+mod))%mod; } } for(int i=1;i<=stot;i++){ for(int j=1;j<=stot;j++){ if(sons[i]%sons[j]) continue; ans[i]=(ans[i]+dp[stot][j])%mod; } }while(Q--){ int x; cin>>x; x=mp[__gcd(x,P)]; cout<<ans[x]<<"\n"; } return 0; }
信息
- ID
- 753
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 6
- 已通过
- 1
- 上传者