NOIP2009 Hankson 的趣味题
2015-10-20 17:11
351 查看
题目:http://www.luogu.org/problem/show?pid=1072#
分析:
1.gcd(x,a0)=a1;
gcd(x/a1,a0/a1)=1;
2.x*b0=b1*gcd(x,b0);
gcd(x,b0)=x*b0/b1;
gcd(b1/b0,b1/x)=1;
然后√n 枚举判断上述两个结论,欧几里得算法是logn,所以时间复杂度是√n*logn
代码:
分析:
1.gcd(x,a0)=a1;
gcd(x/a1,a0/a1)=1;
2.x*b0=b1*gcd(x,b0);
gcd(x,b0)=x*b0/b1;
gcd(b1/b0,b1/x)=1;
然后√n 枚举判断上述两个结论,欧几里得算法是logn,所以时间复杂度是√n*logn
代码:
#include <cstdio> #include <algorithm> #include <cstring> #include <cmath> using namespace std; int ans; int gcd(int a,int b) { return b==0?a:gcd(b,a%b); } int main() { int T,i,j,a0,a1,b0,b1; scanf("%d",&T); while(T--) { scanf("%d%d%d%d",&a0,&a1,&b0,&b1); //len=sqrt(b1+0.5); ans=0; for(i=1;i*i<=b1;i++) { if(b1%i==0){ if(i%a1==0&&(gcd(i/a1,a0/a1)==1)&&(gcd(b1/b0,b1/i)==1)) ans++; j=b1/i; if(j%a1!=0||i==j) continue; if((gcd(j/a1,a0/a1)==1)&&(gcd(b1/b0,b1/j)==1)) ans++; } } printf("%d\n",ans); } return 0; }
相关文章推荐
- Data URI
- 4000 Android SD卡读写
- [daemon进程] daemon 进程为什么要fork两次
- JavaScript基本的输出和嵌入式写法教程
- Import a SPWeb以及注意事项
- FAQ04172]如何修改有几张卡插入就显示几个信号图标
- 搜索引擎爬虫工作原理
- 插入排序
- 一张图告诉你如何优化web 性能
- 多年前遇到的一道题,留个纪念
- Samba服务安装和配置
- lamp环境下源码编译安装intl扩展
- 【MySQL】【leetcode】 Employees Earning More Than Their Managers解题报告
- angularjs 多个ng-app
- 解决下载Android Build-tools 19.1.0失败
- https跳转到http session丢失问题
- 垂直搜索架构(爬虫部分)
- GDI+绘图
- c语言函数指针的定义
- javascript之jquery多级联动下拉框