zoukankan      html  css  js  c++  java
  • Acwing 200 Hankson的趣味题

    题意:

    给定$a, b, c, d$,求$x$满足$gcd(a, x) = b$且$lcm(c, x) = d$

    思路:

    枚举d的所有约数,判断每个数是否满足条件。(直接枚举会超时)

    优化:枚举质数(相当于d质因子分解),$dfs$枚举所有约数,判断是否满足条件

    Code:

    #include <map>
    #include <vector>
    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    
    using namespace std;
    
    typedef long long ll;
    
    ll a, b, c, d, x;
    vector <pair<int, int>> v;
    map <ll, bool> mp;
    
    void dfs(int cnt, ll res){
        if(!mp[res] && __gcd(a, res)== b && c / __gcd(c, res) * res == d){
            x ++; 
            mp[res] = true;
        }
        if(cnt == (int)v.size()) return;
        int p = v[cnt].first, k = v[cnt].second;
        ll mid = 1;
        for(int i = 0; i <= k; i ++){
            dfs(cnt + 1, res * mid);
            mid *= p;
        }
    }
    
    int main(){
        
        int n;
        scanf("%d", &n);
        
        while(n --){
            x = 0;
            scanf("%lld%lld%lld%lld", &a, &b, &c, &d);
            
            v.clear();
            mp.clear();
            ll k = d;
            for(int i = 2; i <= k / i; i ++){
                if(k % i == 0){
                    int s = 0;
                    while(k % i == 0){
                        s ++;
                        k /= i;
                    }
                    v.push_back({i, s});
                }
            }
            if(k > 1) v.push_back({k, 1});
            
            dfs(0, 1);
            cout << x << endl;
        }
        
        return 0;
    }
  • 相关阅读:
    MYSQL关于数据库的操作命令
    理解js中的原型和原型链
    float引起的高度塌陷问题
    使用webpack2.0 搭建前端项目
    jquery插件开发总结
    js中的OOP编程
    关于gulp的基本使用
    关于requireJs的学习总结
    vuex的学习总结
    事件中的target与currentTarget的区别
  • 原文地址:https://www.cnblogs.com/jungu/p/13416513.html
Copyright © 2011-2022 走看看