2020 China Collegiate Programming Contest Weihai Site

2020 China Collegiate Programming Contest Weihai Site

A Golden Spirit

#include <bits/stdc++.h>

#define int ll
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 10;
const int mod = 998244353;

void solve() {
    
    
    ll n, x, t;
    cin >> n >> x >> t;
    ll ans = 4 * n * t;
    ll res = 2 * n * t + t;
    if (x > 2 * (n - 1) * t) {
    
    
        if (res - t < x) res = t + x - 2 * n * t;
        else res = t;
        ans += min(res, x - 2 * (n - 1) * t);
    }
    cout << ans << '\n';
}

signed main() {
    
    
    //ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    int _ = 1;
    cin >> _;
    while (_--) solve();
    return 0;
}

D ABC Conjecture

#include<bits/stdc++.h>

using namespace std;
typedef long long ll;
typedef long long LL;
map<ll, ll> mmp;
ll n, Max = 0;

inline ll mul(ll a, ll b, ll mod) {
    
    
    ll d = (long double) a / mod * b + 1e-8;    //还必须是long double……double精度不够
    ll r = a * b - d * mod;
    return r < 0 ? r + mod : r;
}

inline ll quickpow(ll a, ll b, ll mod) {
    
    
    ll ret = 1;
    for (; b; b >>= 1, a = mul(a, a, mod))
        if (b & 1) ret = mul(ret, a, mod);
    return ret;
}

inline bool test(ll a, ll d, ll n) {
    
    
    ll t = quickpow(a, d, n);
    if (t == 1) return 1;
    while (d != n - 1 && t != n - 1 && t != 1) t = mul(t, t, n), d <<= 1;
    return t == n - 1;                       //这里就不用判1了,因为只可能在while前出现1的情况
}

int a[] = {
    
    2, 3, 5, 7, 11};

inline bool miller_rabin(ll n) {
    
    
    if (n == 1) return 0;
    for (int i = 0; i < 5; ++i)        //先粗筛一遍
    {
    
    
        if (n == a[i]) return 1;
        if (!(n % a[i])) return 0;
    }
    ll d = n - 1;
    while (!(d & 1)) d >>= 1;
    for (int i = 1; i <= 5; ++i)        //搞五遍
    {
    
    
        ll a = rand() % (n - 2) + 2;//x属于[2, n - 1]
        if (!test(a, d, n)) return 0;
    }
    return 1;
}

inline ll gcd(ll a, ll b) {
    
     return b ? gcd(b, a % b) : a; }

inline ll f(ll x, ll a, ll mod) {
    
     return (mul(x, x, mod) + a) % mod; }

const int M = (1 << 7) - 1;            //我也不知道为啥M是这个数……
ll pollard_rho(ll n)                    //倍增版!减少gcd调用次数。(好像不用判环?)
{
    
    
    for (int i = 0; i < 5; ++i) if (n % a[i] == 0) return a[i];
    ll x = rand(), y = x, t = 1, a = rand() % (n - 2) + 2;
    for (int k = 2;; k <<= 1, y = x) {
    
    
        ll q = 1;
        for (int i = 1; i <= k; ++i) {
    
    
            x = f(x, a, n);
            q = mul(q, abs(x - y), n);
//            if(i >= M)	//不等价!
            if (!(i & M))    //超过了2 ^ 7,再用gcd
            {
    
    
                t = gcd(q, n);
                if (t > 1) break;    //找到了
            }
        }
        if (t > 1 || (t = gcd(q, n)) > 1) break;    //之所以再求一遍,是处理刚开始k < M的情况
    }
    return t;
}

LL factor[100], total = 0;

inline void find(ll x) {
    
    
    if (x == 1 || x <= Max) return;
    if (miller_rabin(x)) {
    
    
        factor[++total] = x;
        return;
    }
    ll p = x;
    while (p == x) p = pollard_rho(x);
    //while (x % p == 0) x /= p;
    find(p);
    find(x/p);
}

int main() {
    
    
    long long n, m, i, t;
    scanf("%lld", &t);
    while (t--) {
    
    
        mmp.clear();
        scanf("%lld", &n);
        if (miller_rabin(n) || n == 1) {
    
    
            printf("no\n");
        } else {
    
    
            memset(factor, 0, sizeof(factor));
            total = 0;
            find(n);
            sort(factor + 1, factor + total + 1);
            bool flag = 1;
            for (long long i = 1; i <= total; i++) {
    
    
                mmp[factor[i]]++;
                if (mmp[factor[i]] >= 2) {
    
    
                    flag = 0;
                    cout << "yes" << endl;
                    break;
                }
            }
            if (flag == 1) {
    
    
                cout << "no" << endl;
            }
        }
    }
    return 0;
}

H Message Bomb

#include <bits/stdc++.h>

#define int ll
using namespace std;
typedef long long ll;
const int maxn = 2e5 + 10;
const int mod = 998244353;

map<int ,int >mp[maxn];
int b[maxn];
int a[maxn];

void solve() {
    
    
    int n,m,s;
    cin>>n>>m>>s;
    for (int i = 1; i <=s; ++i) {
    
    
        int t,x,y;
        cin>>t>>x>>y;
        if(t==1) mp[x][y]-=b[y];
        if(t==2) a[x]+=b[y]+mp[x][y],mp[x].erase(y);
        if(t==3) a[x]--,b[y]++;
    }
    for (int i = 1; i <=m; ++i)
        for(auto x:mp[i])
            a[i]+=b[x.first]+x.second;
    for (int i = 1; i <=m; ++i)
        cout<<a[i]<<"\n";
}

signed main() {
    
    
    //ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    int _ = 1;
    //cin >> _;
    while (_--) solve();
    return 0;
}

L Clock Master

#include <bits/stdc++.h>

#define int ll
using namespace std;
typedef long long ll;
const int maxn = 3e4 + 10;
const int mod = 998244353;

double dp[maxn], w[maxn];
int vis[maxn], pri[maxn];
int cnt = 0;

void prime() {
    
    
    for (int i = 2; i < maxn; ++i) {
    
    
        if (!vis[i]) pri[++cnt] = i, vis[i] = 1;
        for (int j = i; j <= maxn / i; j++)
            vis[i * j] = 1;
    }
}

void doshit() {
    
    
    for (int i = 1; i < maxn; i++) w[i] = log(i);
    for (int i = 1; i <= cnt; ++i)
        for (int j = maxn - 1; j >= pri[i]; --j)
            for (int k = pri[i]; k <= j; k *= pri[i])
                if (j >= k) dp[j] = max(dp[j], dp[j - k] + w[k]);
}

void solve() {
    
    
    int n;
    cin >> n;

    printf("%.10f\n", dp[n]);
}

signed main() {
    
    
    //ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    int _ = 1;
    cin >> _; prime();doshit();
    while (_--) {
    
    
       solve();
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_45436102/article/details/109626584
今日推荐