1. 程式人生 > 實用技巧 >牛客多校 第四場 B,H 題解

牛客多校 第四場 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\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