codeforces 900D(组合数学+剪枝)
2017-12-21 18:28
405 查看
题目链接:http://codeforces.com/problemset/problem/900/D
数列的最大公因数为x则所有的ai均可以由x表示于是若有这样的数组则y%x==0。数组可以分成多个x,于是可以把此题转化成将y/x个x放进m个箱子里(不允许有空箱子),于是这道题便转化成了经典的组合数学问题方案数为C(y/x-1,m-1)把m从2一直叠加到y/x-1于是总共的方案数变化成了2^(y/x-1)-1。但是这样子会存在非法的序列例如当x=3,y=12相当于4个3,在这里若直接拿上述方法做会出现6,6这样的方案数,此序列的最大公因数将不再是3而是6所以要减去这样的方案数。可以发现产生这样的情况是因为m为y/x的因子于是减去当m为y/x的因子的情况以即可。在这里注意要剪枝不然会超时!
数列的最大公因数为x则所有的ai均可以由x表示于是若有这样的数组则y%x==0。数组可以分成多个x,于是可以把此题转化成将y/x个x放进m个箱子里(不允许有空箱子),于是这道题便转化成了经典的组合数学问题方案数为C(y/x-1,m-1)把m从2一直叠加到y/x-1于是总共的方案数变化成了2^(y/x-1)-1。但是这样子会存在非法的序列例如当x=3,y=12相当于4个3,在这里若直接拿上述方法做会出现6,6这样的方案数,此序列的最大公因数将不再是3而是6所以要减去这样的方案数。可以发现产生这样的情况是因为m为y/x的因子于是减去当m为y/x的因子的情况以即可。在这里注意要剪枝不然会超时!
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <vector> #include <map> using namespace std; typedef long long int LL; const int mod=1e9+7; const int maxn=100; LL num[maxn]={}; int x,y,cnt=0; map<int,int>vis; //剪枝遇到相同的y/x则直接返回即可 LL num_pow(LL a,LL k){ LL res=1; for(;k;k>>=1){ if(k&1) res=(res*a)%mod; a=(a*a)%mod; } return res; } LL dfs(LL mid){ if(mid==1) return 1; LL ans=(num_pow(2,mid-1)-1+mod)%mod; if(vis.count(mid)) return vis[mid]; for(int i=0;i<cnt && num[i]*num[i]<=mid;i++)if(mid%num[i]==0){ ans=(ans-dfs(mid/num[i])+mod)%mod; if(num[i]*num[i]!=mid) ans=(ans-dfs(num[i])+mod)%mod; } vis[mid]=ans; return ans; } int main() { while(scanf("%d%d",&x,&y)==2){ vis.clear();cnt=0; memset(num,0,sizeof(num)); if(y%x!=0){ printf("0\n"); continue; } for(int i=2;i*i<=y/x;i++)if(y/x%i==0)//提取全部的因子 num[cnt++]=i; printf("%lld\n",dfs(y/x)); } return 0; }
相关文章推荐
- codeforces 900D(组合数学+剪枝)
- Codeforces Round #419 (Div. 2) (Codeforces 815B) D. Karen and Test 组合数学
- codeforces 569 D. Symmetric and Transitive (组合数学 第二类斯特林数 贝尔数)
- 【组合数学思维】CodeForces - 233C Cycles
- CodeForces 152 C.Pocket Book(组合数学)
- CodeForces 272 D.Dima and Two Sequences(组合数学)
- CodeForces 319 A.Malek Dance Club(组合数学)
- CodeForces 785D Anton and School - 2 组合数学
- Codeforces-785D (组合数学)
- CodeForces 128C Games with Rectangle [组合数学+基础DP]
- codeforces 914C. Travelling Salesman and Special Numbers (DP + 组合数学)
- CodeForces 229 C.Triangles(组合数学)
- CodeForces 768 F.Barrels and boxes(组合数学)
- CodeForces 785D Anton and School - 2 (组合数学)
- CodeForces 554C 组合数学
- Codeforces 559C Gerald and Giant Chess 组合数学 DP
- CodeForces 26 D.Tickets(组合数学)
- Codeforces 557D Vitaly and Cycle 【染色判二分图 + 组合数学】
- codeforces 785 D Anton and School - 2(组合数学)
- CodeForces 396A 数论 组合数学