貌似是比大多数题解优的 $O(n^2logn)$ ~

Code:

#include <bits/stdc++.h>
#define N 50004
#define setIO(s) freopen(s".in","r",stdin) , freopen(s".out","w",stdout)
using namespace std;
struct Node
{
int prime,p;
Node(int prime=0,int p=0):prime(prime),p(p){}
};
vector<Node>v;
int tot,re=0,a0,a1,b0,b1,h,cons;
int prime[N],vis[N];
void init()
{
int i,j;
for(i=2;i<N;++i)
{
if(!vis[i]) prime[++tot]=i;
for(j=1;j<=tot&&i*prime[j]<N;++j)
{
vis[i*prime[j]]=1;
if(i%prime[j]==0) break;
}
}
}
void dfs(int pos,int num)
{
int i,j;
for(i=1;i<=v[pos].p;++i)
{
num*=v[pos].prime;
if(__gcd(num*cons, a0)==a1)
{
++re;
}
for(j=pos+1;j<v.size();++j) dfs(j,num);
}
}
void solve()
{
int i,j;
scanf("%d%d%d%d",&a0,&a1,&b0,&b1),cons=b1,h=b0,re=0;
for(i=1;i<=tot&&h>=prime[i];++i)
{
if(h%prime[i]==0)
{
int cc=0,pp=cons;
for(;h%prime[i]==0;h/=prime[i]) ++cc,pp/=prime[i];
if(pp%prime[i]) // 可自由分配
{
v.push_back(Node(prime[i],cc));
for(;cons%prime[i]==0;cons/=prime[i]);
}
}
}
if(h!=1)
{
if((cons/h)%h)
v.push_back(Node(h,1)),cons/=h;
}
for(i=0;i<v.size();++i)
dfs(i,1);
v.clear();
printf("%d\n",re+(__gcd(cons,a0)==a1));
}
int main()
{
int T,i;
init();
// setIO("input");
scanf("%d",&T);
for(i=1;i<=T;++i) solve();
return 0;
}

  

最新文章

  1. Raneto Docs(开源的知识库建站程序)
  2. django创建blog
  3. AS快捷键
  4. Linux移植的一般过程
  5. Nginx反向代理和负载均衡——个人配置
  6. 1 Ionic和Hybird应用介绍
  7. linux笔记:shell基础-概述和脚本执行方式
  8. python案例-用户登录
  9. edm注意细节
  10. Oracle EBS R12 WIP Component Issue&amp;Return Process
  11. jQuery多图上传Uploadify插件使用及传参详解
  12. Java——类比较器
  13. JSON 数据的系统解析
  14. Linux 上Oracle RAC 10g 升级到 Oracle RAC 11g
  15. getHibernateTemplate().find()
  16. 如何解决office2007每次打开都要正在配置
  17. Android 4.4堆叠结构的变化
  18. Java学习第一周
  19. 移动设备分辨率(终于弄懂了为什么移动端设计稿总是640px和750px)
  20. centos 7 进入图形界面

热门文章

  1. GIL全局解释器
  2. T100错误信息提示方式
  3. 不同主机的docker内容器通过直接路由的方式进行通信
  4. webpack自定义loader并发布
  5. sql server存储过程回滚事务
  6. H5移动端弹幕动画实现
  7. mintUI和mUI
  8. element-ui 中日期控件限制时间跨度
  9. 不错的abap技术网站
  10. Java学习笔记【十、泛型】