• codeforces 17D Notepad


    codeforces 17D Notepad

    题意

    题解

    TBD

    更新模板(phi、欧拉降幂)

    代码

    #include<bits/stdc++.h>
    using namespace std;
    #define fi first
    #define se second
    #define mp make_pair
    #define pb push_back
    #define rep(i, a, b) for(int i=(a); i<(b); i++)
    #define sz(x) (int)x.size()
    #define de(x) cout<< #x<<" = "<<x<<endl
    #define dd(x) cout<< #x<<" = "<<x<<" "
    typedef long long ll;
    typedef pair<int, int> pii;
    typedef vector<int> vi;
    
    string B, N;
    ll c, b, n;
    
    ll add(ll a, ll b, int P) {
    	return (a + b) % P; 
    }
    ll mul(ll a, ll b, int P) {
    	return a * b % P;
    }
    ll calc(string s, int P) {
    	ll res = 0;
    	rep(i, 0, sz(s)) res = add(mul(res, 10, P), s[i] - '0', P);
    	return res;
    }
    int phi(int n) {
        int ans=n;
        for(int i=2;i*i<=n;i++) if(n%i==0) {
            ans=ans/i*(i-1);
            while(n%i==0)n/=i;
        }
        if(n>1)ans=ans/n*(n-1);
        return ans;
    }
    ll kpow(ll a, ll b, int P) {
    	ll res = 1;
    	while(b) {
    		if(b & 1) res = mul(res, a, P);
    		a = mul(a, a, P);
    		b >>= 1;
    	}
    	return res;
    }
    
    int main() {
    	std::ios::sync_with_stdio(false);
    	std::cin.tie(0);
    	cin >> B >> N >> c;
    	int pc = phi(c);
    	b = calc(B, c);
    	n = calc(N, pc);
    	n = add(n, pc - 1, pc);
    	ll ans;
    	if(sz(N) < 11) {
    		ll x = 0;
    		rep(i, 0, sz(N)) x = x * 10 + N[i] - '0';
    		ans = kpow(b, x - 1, c);
    	} else {
    		ans = kpow(b, n + pc, c);
    	}
    	b = add(b, c - 1, c);
    	ans = mul(ans, b, c);
    	cout << (ans ? ans : c) << endl;
    	return 0;
    }
    
  • 相关阅读:
    洛谷P1170 兔八哥与猎人 欧拉函数的应用
    洛谷P1056 排座椅
    洛谷P1177 【模板】快速排序
    洛谷1059 明明的随机数
    洛谷P1372 又是毕业季I
    洛谷P1042 乒乓球
    洛谷P1086 花生采摘
    洛谷P1031 均分纸牌
    洛谷P1068 分数线划定
    洛谷P1781 宇宙总统
  • 原文地址:https://www.cnblogs.com/wuyuanyuan/p/9295254.html
Copyright © 2020-2023  润新知