• 洛谷 P1072 Hankson 的趣味题(数学||唯一分解定理)


    题目链接:https://www.luogu.com.cn/problem/P1072

    更高效:

    预处理的质数中从2~$sqrt d$,检查每一个质数是不是d的约数,如果是,按上述方法计算$cnt_p$。如果d不能被上述所有的质数整除,则说明d本身是质数,应该计算$cnt_d$。

    AC代码:

     1 #include<cstdio>
     2 #include<iostream>
     3 using namespace std;
     4 const int N=100006;
     5 const int M=50005;
     6 int vis[N],p[N];
     7 int n,cnt,ans,ma,mb,mc,md;
     8 int a,b,c,d;
     9 void is_prime(){
    10     for(int i=2;i<=M;i++){
    11         if(!vis[i]) p[++cnt]=i;
    12         for(int j=1;j<=cnt;j++){
    13             if(i*p[j]>M) break;
    14             vis[i*p[j]]=1;
    15             if(i%p[j]==0) break;
    16         }
    17     }
    18 } 
    19 int get(int &x,int y){
    20     int sum=0;
    21     while(x%y==0) x/=y,sum++;
    22     return sum;
    23 }
    24 int calc(int x){
    25     int sum=0;
    26     int ma=get(a,x),mb=get(b,x),mc=get(c,x),md=get(d,x);
    27     if(ma==mc&&mb==md&&mc<=md) sum=md-mc+1;
    28     else if(ma>mc&&mb==md&&mc<=md) sum=1;
    29     else if(ma==mc&&mb<md&&mc<=md) sum=1;
    30     else if(ma>mc&&mb<md&&mc==md) sum=1;
    31     return sum;
    32 }
    33 int main(){
    34     scanf("%d",&n);
    35     is_prime();
    36     while(n--){
    37         ans=1;
    38         scanf("%d%d%d%d",&a,&c,&b,&d);
    39         for(int i=1;i<=cnt&&p[i]*p[i]<=d;i++)
    40             if(d%p[i]==0) ans*=calc(p[i]);
    41         if(d>1) ans*=calc(d);
    42         printf("%d
    ",ans);
    43     }
    44     return 0;
    45 }
    AC代码
  • 相关阅读:
    undo表空间
    SQL*Plus快速入门
    win10用命令net启动服务没权限解决办法
    Oracle表空间管理
    Oracle数据泵(上)
    windows的bat脚本
    Servlet映射细节
    JSP技术(一)
    690. Employee Importance
    BFS和DFS详解以及java实现(转载)
  • 原文地址:https://www.cnblogs.com/New-ljx/p/13915989.html
Copyright © 2020-2023  润新知