zoukankan      html  css  js  c++  java
  • AcWing200 Hankson的趣味题(数学)

    这题我们很容易想到可以先求出x的取值,再进行比对看看是否可以

    但是如果我们直接求出所有x的取值复杂度会超,因为求约数的复杂度较高

    所以我们考虑先求去所以质因数,再通过dfs来求约数

    之后进行比对即可。

    #include<iostream>
    #include<string>
    using namespace std;
    typedef long long ll;
    const int N=1e5+10;
    int primes[N];
    int st[N];
    int idx;
    int cnt;
    int div1[N];
    int cnt1;
    struct node{
        int p,s;
    }s[N];
    void init(){
        int i;
        for(i=2;i<N;i++){
            if(!st[i]){
                primes[cnt++]=i;
                st[i]=1;
            }
            else{
                int j;
                for(j=0;primes[j]*i<N;j++){
                    st[i*primes[j]]=1;
                    if(i%primes[j]==0)
                    break;
                }
            }
        }
    }
    int gcd(int a,int b){
        return b?gcd(b,a%b):a;
    }
    void dfs(int u,int p){
        if(u==idx){
            div1[cnt1++]=p;
            return ;
        }
        int i;
        for(i=0;i<=s[u].s;i++){
            dfs(u+1,p);
            p*=s[u].p;
        }
    }
    int main(){
        int t;
        cin>>t;
        init();
        while(t--){
            int a,b,c,d;
            cin>>a>>b>>c>>d;
            int i;
            int tmp=d;
            idx=0;
            for(i=0;primes[i]<=tmp/primes[i];i++){
                int sign=primes[i];
                if(tmp%sign==0){
                    int num=0;
                    while(tmp%sign==0){
                        tmp/=sign;
                        num++;
                    }
                    s[idx++]={sign,num};
                }
            }
            if(tmp>1){
                s[idx++]={tmp,1};
            }
            cnt1=0;
            dfs(0,1);
            int res=0;
            for(i=0;i<cnt1;i++){
                int num=div1[i];
                if(gcd(num,a)==b&&(ll)num*c/gcd(num,c)==d)
                 res++;
            }
            cout<<res<<endl;
        }
    }
    View Code
  • 相关阅读:
    花匠
    积木
    Hello world
    老鼠走迷宫全部路径
    今天下午选做题目
    整数高精度运算——加法
    博客启航
    解线性不定方程
    关于完全背包问题
    关于最小代价子母树
  • 原文地址:https://www.cnblogs.com/ctyakwf/p/12547314.html
Copyright © 2011-2022 走看看