2017 Chinese Multi-University Training, BeihangU Contest

2017 Chinese Multi-University Training, BeihangU Contest

Add More Zero

思路:log10(2^m) = m*log10(2)

代码:

#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize(4)
#include<bits/stdc++.h>
using namespace std;
#define y1 y11
#define fi first
#define se second
#define pi acos(-1.0)
#define LL long long
//#define mp make_pair
#define pb emplace_back
#define ls rt<<1, l, m
#define rs rt<<1|1, m+1, r
#define ULL unsigned LL
#define pll pair<LL, LL>
#define pli pair<LL, int>
#define pii pair<int, int>
#define piii pair<int, pii>
#define puu pair<ULL, ULL>
#define pdd pair<long double, long double>
#define mem(a, b) memset(a, b, sizeof(a))
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define fopen freopen("in.txt", "r", stdin);freopen("out.txt", "w", stout);
//head
 
int n, cs = 0;
int main() {
    while(~scanf("%d", &n)) {
        printf("Case #%d: %d\n", ++cs, (int)(n*log10(2.0)));
    }
    return 0;
}
View Code

Balala Power!

思路:大数比较大小

代码:

#include <cstdio>
#include <vector>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <queue>
using namespace std;
#define pb push_back
#define fi first
#define se second
#define debug(x) cerr<<#x << " := " << x << endl;
#define bug cerr<<"-----------------------"<<endl;
#define FOR(a, b, c) for(int a = b; a <= c; ++ a)
typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
 
const int inf = 0x3f3f3f3f;
 
const int mod = 1e9+7;
 
/**********showtime************/
            const int maxn = 1e5+9;
            char str[maxn];
            string ss[maxn];
            vector<pii>vec[30];
            int a[30][maxn], mx[30];
            int id[30], vis[30];
            bool cmp(int &x, int &y) {
                if(mx[x] < mx[y]) return true;
                else if(mx[x] > mx[y]) return false;
                else {
                    for (int i = mx[x]-1; i >= 0; --i) {
                        if(a[x][i] > a[y][i]) return false;
                        else if(a[x][i] < a[y][i]) return true;
                    }
                }
                return false;
            }
int main(){
            int n, cas = 0;
            while(~scanf("%d", &n)) {
 
                for(int i=0; i<26; i++) vec[i].clear(), vis[i] = 0, mx[i] = 0;
                for(int i=0; i<26; i++) for(int j=0; j<maxn; j++) a[i][j]  = 0;
                for(int i=1; i<=n; i++) {
                    scanf("%s", str);
                    ss[i] = string(str);
                    vis[str[0] - 'a'] = 1;
                }
 
                for(int i=1; i<=n; i++) {
                    int len = ss[i].length();
                    for(int j=0; j<len; j++) {
                        a[ss[i][j] - 'a'][len - j - 1] ++;
                    }
                }
 
                for(int i=0; i<26; i++) {
                    int jin = 0;
                    for(int j=0; j<maxn-1; j++) {
                        a[i][j] += jin;
                        jin = a[i][j] / 26;
                        a[i][j] = a[i][j] % 26;
                        if(a[i][j] > 0) {
                            mx[i] = j+1;
                        }
                    }
                }
 
                for(int i=0; i<26; i++) id[i] = i;
 
                sort(id, id+26, cmp);
 
                int pos = 0;
                while(vis[id[pos]]) pos++;
                int pt = id[pos];
                for(int i=pos; i>=0; i--) id[i] = id[i-1];
                id[0] = pt;
                ll ans = 0;
                for(int i=0; i<26; i++) {
                    ll base = 1;
                    for(int j=0; j<maxn; j++) {
 
                        ans = (ans + 1ll*i * base *a[id[i]][j] % mod)%mod;
                        base = 1ll * base * 26 % mod;
                    }
                }
                ++cas;
                printf("Case #%d: %lld\n",cas,  ans);
            }
            return 0;
}
View Code

Colorful Tree

思路:容斥,考虑对于每种颜色删去后,分成的块中的点两两之间对于这种颜色没有贡献

代码:

#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize(4)
#include<bits/stdc++.h>
using namespace std;
#define y1 y11
#define fi first
#define se second
#define pi acos(-1.0)
#define LL long long
//#define mp make_pair
#define pb push_back
#define ls rt<<1, l, m
#define rs rt<<1|1, m+1, r
#define ULL unsigned LL
#define pll pair<LL, LL>
#define pli pair<LL, int>
#define pii pair<int, int>
#define piii pair<pii, int>
#define pdd pair<double, double>
#define mem(a, b) memset(a, b, sizeof(a))
#define debug(x) cerr << #x << " = " << x << "\n";
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
//head

const int N = 2e5 + 5;
vector<int> g[N], stk[N];
int n, u, v, c[N], sz[N], blo[N], top[N];
bool vis[N];
void dfs(int u, int o) {
    sz[u] = 1;
    for (int v : g[u]) {
        if(v != o) {
            dfs(v, u);
            sz[u] += sz[v];
        }
    }
    blo[u] = sz[u];
}
void DFS(int u, int o) {
    if(stk[c[u]].empty()) top[c[u]] -= sz[u];
    else blo[stk[c[u]].back()] -= sz[u];
    for (int v : g[u]){
        if(v != o) {
            stk[c[u]].pb(v);
            DFS(v, u);
            stk[c[u]].pop_back();
        }
    }
}
int cs = 0;
int main() {
    while(~scanf("%d", &n)) {
        for (int i = 1; i <= n; ++i) scanf("%d", &c[i]), vis[c[i]] = true;
        for (int i = 1; i < n; ++i) scanf("%d %d", &u, &v), g[u].pb(v), g[v].pb(u);
        dfs(1, 0);
        int cc = 0;
        for (int i = 1; i <= n; ++i) if(vis[i]) top[i] = n, ++cc; else top[i] = 0;
        DFS(1, 0);
        LL ans = n*1LL*(n-1)/2*cc;
        for (int i = 2; i <= n; ++i) ans -= blo[i]*1LL*(blo[i]-1)/2;
        for (int i = 1; i <= n; ++i) ans -= top[i]*1LL*(top[i]-1)/2;
        printf("Case #%d: %lld\n", ++cs, ans);
        for (int i = 1; i <= n; ++i) g[i].clear(), vis[i] = false;
    }
    return 0;
}
View Code

Division Game

Expectation of Division

Function

思路:a的某个长度为x环可以和b中长度为x因子的环构成函数

代码:

#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize(4)
#include<bits/stdc++.h>
using namespace std;
#define y1 y11
#define fi first
#define se second
#define pi acos(-1.0)
#define LL long long
//#define mp make_pair
#define pb push_back
#define ls rt<<1, l, m
#define rs rt<<1|1, m+1, r
#define ULL unsigned LL
#define pll pair<LL, LL>
#define pli pair<LL, int>
#define pii pair<int, int>
#define piii pair<pii, int>
#define pdd pair<double, double>
#define mem(a, b) memset(a, b, sizeof(a))
#define debug(x) cerr << #x << " = " << x << "\n";
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
//head
 
const int N = 1e5 + 5;
const int MOD = 1e9 + 7;
int n, m, a[N], b[N], ca[N], cb[N];
LL ans[N];
bool vis[N], vv[N];
LL q_pow(LL n, LL k) {
    LL res = 1;
    while(k) {
        if(k&1) res = (res * n) % MOD;
        n = (n * n) % MOD;
        k >>= 1;
    }
    return res;
}
int main() {
    int cs = 0;
    while(~scanf("%d %d", &n, &m)) {
        for (int i = 0; i < n; ++i) vis[i] = false, ca[i+1] = 0, ans[i+1] = 0;
        for (int i = 0; i < m; ++i) vv[i] = false, cb[i+1] = 0;
        for (int i = 0; i < n; ++i) scanf("%d", &a[i]);
        for (int i = 0; i < m; ++i) scanf("%d", &b[i]);
        for (int i = 0; i < n; ++i) {
            if(!vis[i]) {
                int now = i, cc = 0;
                while(!vis[now]) {
                    vis[now] = true;
                    now = a[now];
                    ++cc;
                }
                ca[cc]++;
            }
        }
        for (int i = 0; i < m; ++i) {
            if(!vv[i]) {
                int now = i, cc = 0;
                while(!vv[now]) {
                    vv[now] = true;
                    now = b[now];
                    ++cc;
                }
                cb[cc] ++;
            }
        }
        LL res = 1;
        for (int i = 1; i <= m; ++i) {
            cb[i] = (cb[i]*1LL*i)%MOD;
            for (int j = i; j <= n; j += i) {
                ans[j] = (ans[j] + cb[i]) % MOD;
            }
        }
        for (int j = 1; j <= n; ++j) {
            if(ca[j]) {
                res = (res * q_pow(ans[j], ca[j])) % MOD;
            }
        }
        printf("Case #%d: %lld\n", ++cs, res);
    }
    return 0;
}
View Code

Gear Up

Hints of sd0061

思路:nth_element

代码:

#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize(4)
#include<bits/stdc++.h>
using namespace std;
#define y1 y11
#define fi first
#define se second
#define pi acos(-1.0)
#define LL long long
//#define mp make_pair
#define pb push_back
#define ls rt<<1, l, m
#define rs rt<<1|1, m+1, r
#define ULL unsigned LL
#define pll pair<LL, LL>
#define pli pair<LL, int>
#define pii pair<int, int>
#define piii pair<pii, int>
#define pdd pair<double, double>
#define mem(a, b) memset(a, b, sizeof(a))
#define debug(x) cerr << #x << " = " << x << "\n";
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
//head
 
const int N = 1e7 + 5;
unsigned x, A, y, B, z, C;
int n, m, b[105], id[105];
unsigned a[N], ans[N];
inline unsigned rng61() {
    unsigned t;
    x = x ^ (x << 16);
    x = x ^ (x >> 5);
    x = x ^ (x << 1);
    t = x;
    x = y;
    y = z;
    z = (t ^ x) ^ y;
    return z;
}
int cs = 0;
int main() {
    while(~scanf("%d %d %u %u %u", &n, &m, &A, &B, &C)) {
        for (int i = 1; i <= m; ++i) scanf("%d", &b[i]);
        x = A, y = B, z = C;
        for (int i = 1; i <= n; ++i) a[i] = rng61();
        printf("Case #%d: ", ++cs);
        for (int i = 1; i <= m; ++i) id[i] = i;
        sort(id+1, id+1+m, [](int x, int y){
                return b[x] < b[y];
             });
        nth_element(a+1, a+b[id[m]]+1, a+n+1);
        ans[id[m]] = a[b[id[m]]+1];
        for (int i = m-1; i >= 1; --i) {
            nth_element(a+1, a+b[id[i]]+1, a+b[id[i+1]]+1);
            ans[id[i]] = a[b[id[i]]+1];
        }
        for (int i = 1; i <= m; ++i) printf("%u%c", ans[i], " \n"[i==m]);
    }
    return 0;
}
View Code

I Curse Myself

Journey with Knapsack

KazaQ's Socks

思路:打表找规律

代码:

#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize(4)
#include<bits/stdc++.h>
using namespace std;
#define y1 y11
#define fi first
#define se second
#define pi acos(-1.0)
#define LL long long
//#define mp make_pair
#define pb emplace_back
#define ls rt<<1, l, m
#define rs rt<<1|1, m+1, r
#define ULL unsigned LL
#define pll pair<LL, LL>
#define pli pair<LL, int>
#define pii pair<int, int>
#define piii pair<int, pii>
#define puu pair<ULL, ULL>
#define pdd pair<long double, long double>
#define mem(a, b) memset(a, b, sizeof(a))
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define fopen freopen("in.txt", "r", stdin);freopen("out.txt", "w", stout);
//head
 
LL n, k;
int main() {
    int cs = 0;
    while(~scanf("%lld %lld", &n, &k)) {
        LL res;
        if(n == 2) res = k%2 == 0? 2 : 1;
        else if(k <= n-1) res = k;
        else {
            if(k%(n-1) == 1) {
                --k;
                if((k/(n-1))%2) res = n;
                else res = n-1;
            }
            else {
                res = k%(n-1);
                if(res == 0) res = n-1;
                --res;
            }
        }
        printf("Case #%d: %lld\n", ++cs, res);
    }
    return 0;
}
View Code

Limited Permutation

猜你喜欢

转载自www.cnblogs.com/widsom/p/11126596.html