ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2020-07-20 19:31:59  阅读:248  来源: 互联网

标签:prime 第四场 int 题解 back 牛客 ans include define


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\n", 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\n", ans.size());
        for (auto it : ans) {
            printf("%d %d\n", it.fi, it.se);
        }
    }
}
View Code

 

标签:prime,第四场,int,题解,back,牛客,ans,include,define
来源: https://www.cnblogs.com/hznumqf/p/13347226.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有