• 牛客多校 第四场 B,H 题解


    B签到成功

     打表出c的存在没什么作用。

    容易找出规律 答案就是c的某个次数,这个次数就是n的质因子的幂次和。

    因此只需线性筛出幂次和,再快速幂就好了

    #pragma warning(disable:4996)
    
    #include<iostream>
    #include<algorithm>
    #include<bitset>
    #include<tuple>
    #include<unordered_map>
    #include<fstream>
    #include<iomanip>
    #include<string>
    #include<cmath>
    #include<cstring>
    #include<vector>
    #include<map>
    #include<set>
    #include<list>
    #include<queue>
    #include<stack>
    #include<sstream>
    #include<cstdio>
    #include<ctime>
    #include<cstdlib>
    #define INF 0x3f3f3f3f
    #define inf 0x7FFFFFFF
    #define MOD 1000000007
    #define moD 1000000003
    #define pii pair<ll,int>
    #define eps 1e-7
    #define equals(a,b) (fabs(a-b)<eps)
    #define bug puts("bug")
    #define re  register
    #define fi first
    #define se second
    #define pb push_back
    const int maxn = 1e6 + 5;
    const double Inf = 10000.0;
    const double PI = acos(-1.0);
    typedef  long long ll;
    typedef unsigned long long ull;
    using namespace std;
    
    
    ll num[maxn];   
    int vis[maxn];     
    int num_sieve(int n) {
        int cnt = 0;
        for (int i = 2; i <= n; i++) {
            if (!vis[i]) num[i] = 1, vis[i] = 1;
            int j = 2;
            while (j * i <= maxn) if (vis[j]) num[i * j] = num[i] + num[j],vis[j * i] = 1,j++; else break;
        }
        return cnt;  //返回x小于等于n的s素数的个数
    }
    
    
    
    
    ll quickPower(ll a, ll b, ll m) {  
        ll ans = 1;
        ll base = a;
        while (b) {
            if (b & 1) {
                ans *= base;
                ans %= m;
            }
            base *= base;
            base %= m;
            b >>= 1;   
        }
        return ans;
    }
    
    
    
    int main() {
        int T;
        num_sieve(maxn - 3);
        ll n, c;
        scanf("%d", &T);
        while (T--) {
            scanf("%lld%lld", &n, &c);
            if (n == 1ll) {
                puts("1"); continue;
            }
            ll cnt = 0;
           // cout << cnt << endl;
            printf("%lld
    ", quickPower(c, num[n] , MOD));
        }
    
    }
    View Code

    H 。

    给出n,要求从n种分出两组a,b,使ab两两满足gcd > 1

    1.显然1和对于p * 2 > n 的p不可能是答案。

    2.对每个数取最大质因子成为一个集合。

    若集合个数是偶数,可以直接匹配。

    否则,把2p扔进另一组数,剩余的可以两两匹配。

    #pragma warning(disable:4996)
    
    #include<iostream>
    #include<algorithm>
    #include<bitset>
    #include<tuple>
    #include<unordered_map>
    #include<fstream>
    #include<iomanip>
    #include<string>
    #include<cmath>
    #include<cstring>
    #include<vector>
    #include<map>
    #include<set>
    #include<list>
    #include<queue>
    #include<stack>
    #include<sstream>
    #include<cstdio>
    #include<ctime>
    #include<cstdlib>
    #define INF 0x3f3f3f3f
    #define inf 0x7FFFFFFF
    #define MOD 1000000007
    #define moD 1000000003
    #define pii pair<int,int>
    #define eps 1e-7
    #define equals(a,b) (fabs(a-b)<eps)
    #define bug puts("bug")
    #define re  register
    #define fi first
    #define se second
    #define pb push_back
    const int maxn = 5e5 + 5;
    const double Inf = 10000.0;
    const double PI = acos(-1.0);
    typedef  long long ll;
    typedef unsigned long long ull;
    using namespace std;
    
    int prime[maxn];
    int is_prime[maxn];
    int cnt;
    int pfac[maxn];
    
    void is_Prime() {
        is_prime[0] = is_prime[1] = 1;
        for (int i = 2; i <= maxn -3; i++) {
            if (!is_prime[i]) {
                prime[cnt++] = i;
                pfac[i] = i;
                for (int j = 2 * i; j <= maxn - 3; j += i) {
                    is_prime[j] = 1;
                    pfac[j] = i;
                }
            }
        }
    }
    
    vector<int> p[maxn];
    
    int main() {
        int T;
        int m;
        is_Prime();
        scanf("%d", &T);
        while (T--) {
            memset(p, 0, sizeof p);
            scanf("%d", &m);
            vector<pii> ans;
            vector<int> tmp;
            for (int i = 2; i <= m; i++) {
                if (!is_prime[i] && i * 2 > m) continue;
                p[pfac[i]].push_back(i);
            }
            for (int i = 0;; i++) {
                if (prime[i] > m) break;
                if (p[prime[i]].empty()) continue;
                if (p[prime[i]].size() == 1) continue;
                if (p[prime[i]].size() & 1) {
                    tmp.push_back(p[prime[i]][1]);
                    ans.emplace_back(p[prime[i]][0], p[prime[i]][2]);
                    for (int k = 3; k + 1< p[prime[i]].size(); k += 2) {
                        ans.emplace_back(p[prime[i]][k], p[prime[i]][k + 1]);
                    }
                }
                else {
                    for (int k = 0; k + 1 < p[prime[i]].size(); k += 2) ans.emplace_back(p[prime[i]][k], p[prime[i]][k + 1]);
                }
            }
            for (int i = 0; i + 1 < tmp.size(); i+=2) {
                ans.emplace_back(tmp[i], tmp[i + 1]);
            }
            printf("%d
    ", ans.size());
            for (auto it : ans) {
                printf("%d %d
    ", it.fi, it.se);
            }
        }
    }
    View Code
  • 相关阅读:
    upc组队赛3 T-net【贪心】
    upc组队赛5 Assembly Required【思维】
    upc组队赛5 Bulbs
    upc组队赛5 Ingenious Lottery Tickets【排序】
    upc组队赛5 Hunter’s Apprentice 【判断多边形边界曲线顺逆时针】
    upc组队赛5 Ground Defense【枚举】
    upc组队赛4 Go Latin
    upc组队赛4 TV Show Game 【2-SAT】
    POJ 3250 Bad Hair Day【单调栈入门】
    016.NET5_MVC_视图组件扩展定制
  • 原文地址:https://www.cnblogs.com/hznumqf/p/13347226.html
Copyright © 2020-2023  润新知