NOIP2009 Hankson的趣味题
2015-08-10 19:45
369 查看
求出满足条件的x的个数:gcd(x,a0) = a1 lcm(x,b0) = b1
我们不难得到gcd(x/a1,a0/a1) = 1 gcd(b1/x,b0/b1) = 1
以前上数论的时候讲过这道题,结果我没有去及时写,然后就不会做了。。。。暴搜其实也能拿80分。。。
参考了一下网上的题解,写得已经很清楚。
我们不难得到gcd(x/a1,a0/a1) = 1 gcd(b1/x,b0/b1) = 1
以前上数论的时候讲过这道题,结果我没有去及时写,然后就不会做了。。。。暴搜其实也能拿80分。。。
参考了一下网上的题解,写得已经很清楚。
#include<cstdio> #define LL long long #define MAXN 50005 using namespace std; LL gcd(LL a,LL b) { if(b == 0) return a; else return gcd(b,a%b); } int cnt,prime[MAXN]; bool isprime[MAXN]; void init() { for(LL i = 2; i <= MAXN; i++) if(!isprime[i]) { prime[++cnt] = i; for(LL j = i*i; j <= MAXN; j+= i) isprime[j] = 1; } } int cal(int &x,int i) { int res = 0; while(x%i == 0) { res++; x /= i; } return res; } int n; int main() { int T; int a0,a1,b0,b1; scanf("%d",&T); init(); while(T--) { LL ans = 1; scanf("%d%d%d%d",&a0,&a1,&b0,&b1); for(int i = 1; i <= cnt; i++) { if(b1%prime[i] == 0) { int a0c = cal(a0,prime[i]); int a1c = cal(a1,prime[i]); int b0c = cal(b0,prime[i]); int b1c = cal(b1,prime[i]); if(a0c < a1c||b1c < b0c) ans = 0; else if(a0c == a1c&&b0c == b1c) { if(a1c <= b1c) ans *= (b1c - a1c+1); else ans = 0; } else if(a0c == a1c&&b0c < b1c)//至少大于只能 { if(a1c > b1c) ans = 0; } else if(a0c > a1c&&b0c == b1c)//只能大于至多 { if(a1c > b1c) ans = 0; } else if(a1c != b1c) ans = 0; } if(i == cnt && b1 > 1) prime[++cnt] = b1; if(ans == 0) break; } printf("%lld\n",ans); } }
相关文章推荐
- 【COCI 2013】Inspeaker
- 数据库
- JDBC应用小案例
- 创建UIWebView
- 数据结构(14)单链表
- MySQL数据库与登录注册
- 防止.NET应用程序内存溢出(OOM)的一些措施
- CodeForces 4C-Registration system
- HTML笔记
- C语言-Branch
- poj-1611 The Suspects
- 【笔试】16、输出9*9口诀。
- private 私有的 外部不能访问的
- 无责任Windows Azure SDK .NET开发入门篇三[使用Azure AD 管理用户信息--3.5 Delete删除用户]
- CentOS添加永久静态路由
- 保持长宽比 对背景图像进行修改android:scaleType="fitXY"
- JUnit(2)——测试框架
- POJ 2728-Desert King(01分数规划_最优比率生成树)
- index.html
- POJ 3667 Hotel 【线段树 区间合并 + Lazy-tag】