当前位置: 首页 > news >正文

洛谷p1072 gcd,质因数分解

/*
可以得a>=c,b<=d,枚举d的质因子p
那么a,b,c,d,x中包含的p个数是ma,mb,mc,md,mx
在gcd(a,x)=c中
    ma<mc => 无解 
    ma=mc => mx>=mc
    ma>mc => mx=mc 
在lcm(b,x)=d中
    mb<md => mx=md 
    mb=md => mx<=md
    mb>md => 无解 
那么
ma==mc且mb==md时,mc<=mx<=md
ma>mc时 mx=mc,mb<md时,mx=md 
令cntp表示x包含质因子p的方案数 
预处理质数,找出所有d的质因子p,计算cntp,如果d自己也是质数,那么计算一次cntd即可
复杂度O(nsqrt(d)/logd) 
*/
#include<bits/stdc++.h>
using namespace std;
#define ll long long 
ll a,b,c,d,x,ma,mb,mc,md,mx,tot,p[1000000];
ll m,prime[1000000],v[1000000];
void init(int n){
    memset(v,0,sizeof v);
    m=0;
    for(int i=2;i<=n;i++){
        if(v[i]==0){
            v[i]=i;
            prime[++m]=i;
        }
        for(int j=1;j<=m;j++){
            if(prime[j]>v[i] || prime[j]>n/i) break;
            v[i*prime[j]]=prime[j];
        }
    }    
}
int divide(int n,int p){
    int res=0;
    while(n%p==0)res++,n/=p;
    return res;
}

int main(){
    init(sqrt(2000000007));//打表 
    int n;
    scanf("%d",&n);
    while(n--){
        ll ans=1,cnt,tot=0,flag=0;
        scanf("%lld%lld%lld%lld",&a,&c,&b,&d);
        int tmp=d;
        for(int i=1;i<=m;i++){//求出d的所有质因子 
            if(prime[i]>d) break;
            if(d%prime[i]==0) {
                p[++tot]=prime[i];
                while(d%prime[i]==0) d/=prime[i];
            }
        }
        if(d>1)p[++tot]=d;
        
         d=tmp;
        for(int i=1;i<=tot;i++){
            ma=divide(a,p[i]);
            mb=divide(b,p[i]);
            mc=divide(c,p[i]);
            md=divide(d,p[i]);
            if(ma<mc || mb>md)ans=0;//不可能的情况 
            else if(ma==mc && mb==md){//两者都有多解 
                if(mc<=md) ans*=(md-mc+1);
                else ans=0;
            }
            else if(ma==mc && mb<md){//只有一解,可能没有 
                if(mc>md) ans=0;
            }
            else if(mb==md && ma>mc){
                if(mc>md)ans=0;
            }
            else if(mc!=md) ans=0; 
                    
            if(ans==0) break;
        }
        printf("%lld\n",ans);
    }    
}

这是进阶指南第一版的一道题,书上有个推论错了,,

转载于:https://www.cnblogs.com/zsben991126/p/10233169.html

相关文章:

  • 大结局---Miracl库下完全实现SM2加密算法
  • php封装生成随机数函数
  • 洛谷P3372 【模板】线段树 1
  • python3 练习题100例 (二十九)猴子吃桃问题
  • Floyd判断环算法总结
  • freemarker导出定制excel
  • [bzoj1324]Exca王者之剑_最小割
  • Spring Boot 学习笔记(二)第一个 Spring boot 程序
  • 计算机的门电路和加减乘除
  • WPF入门(四)-线形区域Path内容填充之渐变色(LinearGradientBrush)
  • flask请求流程
  • 浅谈贝叶斯公式
  • 第k个素数
  • 21纯 CSS 创作文本滑动特效的 UI 界面
  • canvas-画圆心的算法
  • [译] React v16.8: 含有Hooks的版本
  • Angular 响应式表单 基础例子
  • CentOS 7 防火墙操作
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • gcc介绍及安装
  • Github访问慢解决办法
  • Java 多线程编程之:notify 和 wait 用法
  • Java 网络编程(2):UDP 的使用
  • spring + angular 实现导出excel
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 推荐一个React的管理后台框架
  • 以太坊客户端Geth命令参数详解
  • 用jquery写贪吃蛇
  • 用mpvue开发微信小程序
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • ​VRRP 虚拟路由冗余协议(华为)
  • ​香农与信息论三大定律
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • # 数论-逆元
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • (26)4.7 字符函数和字符串函数
  • (C语言)共用体union的用法举例
  • (floyd+补集) poj 3275
  • (poj1.2.1)1970(筛选法模拟)
  • (ZT)薛涌:谈贫说富
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (规划)24届春招和25届暑假实习路线准备规划
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • (四)Linux Shell编程——输入输出重定向
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • (转)setTimeout 和 setInterval 的区别
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .net 后台导出excel ,word
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)
  • .Net8 Blazor 尝鲜
  • .Net的DataSet直接与SQL2005交互