codeforces 900D(组合数学+剪枝)
2017-12-21 18:28
323 查看
题目链接: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 630H (组合数学)
- Codeforces 886E (Codeforces Round #445) Maximum Element 组合数学+DP
- 51NOD 1509 加长棒 && Codeforces 571 A. Lengthening Sticks(组合数学 + 挡板法)
- CodeForces 431 D.Random Task(组合数学)
- Codeforces 28C Bath Queue - 动态规划 - 组合数学 - 概率与期望
- CodeForces 630H- Benches【组合数学】
- Codeforces 51E Pentagon - 组合数学 - 动态规划
- Codeforces 932 E. Team Work(组合数学)
- Codeforces-785D-Anton and School - 2(组合数学,范德蒙恒等式)
- CodeForces 690 D2.The Wall (medium)(组合数学)
- Codeforces 40E Number Table - 组合数学
- Codeforces 451D - Count Good Substrings(组合数学)
- CodeForces - 584B Kolya and Tanya (组合数学)
- Codeforces 554C Kyoya and Colored Balls 【dp + 组合数学】
- CodeForces - 554C Kyoya and Colored Balls (组合数学&逆元模板)
- CodeForces 213 B.Numbers(组合数学+dp)
- Codeforces 396A 数论,组合数学
- 【Codeforces 869 C The Intriguing Obsession】& 组合数学 & 思维
- Codeforces 711D Directed Roads - 组合数学