每次看看比率至少變成多少倍能大於當前的數node
而後就把兩我的的票都改爲那個數ios
#include <bits/stdc++.h> #define fi first #define se second #define pii pair<int,int> #define mp make_pair #define pb push_back #define space putchar(' ') #define enter putchar('\n') #define eps 1e-10 #define MAXN 100005 //#define ivorysi using namespace std; typedef long long int64; typedef unsigned int u32; typedef double db; template<class T> void read(T &res) { res = 0;T f = 1;char c = getchar(); while(c < '0' || c > '9') { if(c == '-') f = -1; c = getchar(); } while(c >= '0' && c <= '9') { res = res * 10 +c - '0'; c = getchar(); } res *= f; } template<class T> void out(T x) { if(x < 0) {x = -x;putchar('-');} if(x >= 10) { out(x / 10); } putchar('0' + x % 10); } int N; int64 T,A; int64 gcd(int64 a,int64 b) { return b == 0 ? a : gcd(b,a % b); } void Solve() { read(N); int64 t = 1,a = 1; for(int i = 1 ; i <= N ; ++i) { read(T);read(A); int64 k = (t - 1) / T + 1,h = (a - 1) / A + 1; k = max(k,h); t = k * T,a = k * A; } out(a + t);enter; } int main() { #ifdef ivorysi freopen("f1.in","r",stdin); #endif Solve(); return 0; }
布能夠讓你少輸一個或多贏一個,因此能出布就出布,只要以石頭布石頭布不變應萬變就行了c++
#include <bits/stdc++.h> #define fi first #define se second #define pii pair<int,int> #define mp make_pair #define pb push_back #define space putchar(' ') #define enter putchar('\n') #define eps 1e-10 #define MAXN 100005 //#define ivorysi using namespace std; typedef long long int64; typedef unsigned int u32; typedef double db; template<class T> void read(T &res) { res = 0;T f = 1;char c = getchar(); while(c < '0' || c > '9') { if(c == '-') f = -1; c = getchar(); } while(c >= '0' && c <= '9') { res = res * 10 +c - '0'; c = getchar(); } res *= f; } template<class T> void out(T x) { if(x < 0) {x = -x;putchar('-');} if(x >= 10) { out(x / 10); } putchar('0' + x % 10); } int N; char s[MAXN]; void Solve() { scanf("%s",s + 1); N = strlen(s + 1); int ans = 0; for(int i = 1 ; i <= N ; ++i) { if(i & 1) { if(s[i] == 'p') ans--; } else { if(s[i] == 'g') ans++; } } out(ans);enter; } int main() { #ifdef ivorysi freopen("f1.in","r",stdin); #endif Solve(); return 0; }
怎麼是個暴力。。。ui
只要枚舉對面的兩個面,全部的面均可以被固定下來,而後對面的那個面旋轉一下spa
把一個面的四種狀況扔進一個map裏,每次查詢固定後的四個面,查詢到一個面把這個面轉四次帶來的貢獻在map裏給減掉,就完成了去重code
要注意若是這個面不存在要提早退出,否則map裏會加入無用的狀況,會Tget
#include <bits/stdc++.h> #define fi first #define se second #define pii pair<int,int> #define mp make_pair #define pb push_back #define space putchar(' ') #define enter putchar('\n') #define eps 1e-10 #define MAXN 100005 //#define ivorysi using namespace std; typedef long long int64; typedef unsigned int u32; typedef double db; template<class T> void read(T &res) { res = 0;T f = 1;char c = getchar(); while(c < '0' || c > '9') { if(c == '-') f = -1; c = getchar(); } while(c >= '0' && c <= '9') { res = res * 10 +c - '0'; c = getchar(); } res *= f; } template<class T> void out(T x) { if(x < 0) {x = -x;putchar('-');} if(x >= 10) { out(x / 10); } putchar('0' + x % 10); } int N; int c[MAXN][4]; int64 h[MAXN]; map<int64,int> zz; void insert(int64 p,int d) { for(int i = 0 ; i < 4 ; ++i) { zz[p] += d; p = p / 1000 + (p % 1000) * 1000000000LL; } } int64 calc(int64 a,int64 b,int64 c,int64 d) { int64 res = d + c * 1000 + b * 1000000 + a * 1000000000; return res; } int64 getcol(int64 p,int t) { for(int i = 0 ; i < 3 - t ; ++i) p /= 1000; return p % 1000; } void Solve() { read(N); for(int i = 1 ; i <= N ; ++i) { for(int j = 0 ; j < 4 ; ++j) { read(c[i][j]); } h[i] = calc(c[i][0],c[i][1],c[i][2],c[i][3]); insert(h[i],1); } int64 ans = 0; for(int i = 1 ; i <= N ; ++i) { insert(h[i],-1); for(int j = i + 1 ; j <= N ; ++j) { insert(h[j],-1); for(int k = 0 ; k < 4 ; ++k) { int64 res = 1; int64 rec[4] = {0}; rec[0] = calc(getcol(h[i],0),getcol(h[j],1),getcol(h[j],0),getcol(h[i],1)); rec[1] = calc(getcol(h[i],1),getcol(h[j],0),getcol(h[j],3),getcol(h[i],2)); rec[2] = calc(getcol(h[i],2),getcol(h[j],3),getcol(h[j],2),getcol(h[i],3)); rec[3] = calc(getcol(h[i],3),getcol(h[j],2),getcol(h[j],1),getcol(h[i],0)); for(int x = 0 ; x < 4 ; ++x) { res = res * zz[rec[x]]; if(!res) { for(int y = 0 ; y < x ; ++y) { insert(rec[y],1); } goto fail; } insert(rec[x],-1); } for(int x = 0 ; x < 4 ; ++x) { insert(rec[x],1); } fail:; ans += res; h[j] = h[j] / 1000 + (h[j] % 1000) * 1000000000; } insert(h[j],1); } } out(ans);enter; } int main() { #ifdef ivorysi freopen("f1.in","r",stdin); #endif Solve(); return 0; }
考慮一個點雙(由於是簡單環),若是沒有環(兩點一線),那麼乘上Kstring
若是有一個環,那麼用polya定理,每一個置換圈有gcd(i,n)個循環節it
若是有兩個及以上的環,任何一種置換都合法,那麼只和每一個顏色用了多少個有關,用插板法算組合數就是\(\binom{n + k - 1}{k - 1}\)io
#include <iostream> #include <cstdio> #include <vector> #include <algorithm> #include <cmath> #include <cstring> #include <map> //#define ivorysi #define pb push_back #define space putchar(' ') #define enter putchar('\n') #define mp make_pair #define pb push_back #define fi first #define se second #define mo 974711 #define RG register #define MAXN 200005 using namespace std; typedef long long int64; typedef double db; template<class T> void read(T &res) { res = 0;char c = getchar();T f = 1; while(c < '0' || c > '9') { if(c == '-') f = -1; c = getchar(); } while(c >= '0' && c <= '9') { res = res * 10 + c - '0'; c = getchar(); } res *= f; } template<class T> void out(T x) { if(x < 0) {putchar('-');x = -x;} if(x >= 10) { out(x / 10); } putchar('0' + x % 10); } const int MOD = 1000000007; int N,M,K; struct node { int to,next; }E[1005]; int head[55],sumE,fac[205],invfac[205],dfn[55],low[55],idx,sta[105],top,col[55],cnt,ans; vector<int> ver; int mul(int a,int b) {return 1LL * a * b % MOD;} int inc(int a,int b) {a = a + b;if(a >= MOD) a -= MOD;return a;} int fpow(int x,int c) { int res = 1,t = x; while(c) { if(c & 1) res = mul(res,t); t = mul(t,t); c >>= 1; } return res; } int gcd(int a,int b) { return b == 0 ? a : gcd(b,a % b); } void add(int u,int v) { E[++sumE].to = v; E[sumE].next = head[u]; head[u] = sumE; } int C(int n,int m) { if(n < m) return 0; return mul(mul(fac[n],invfac[m]),invfac[n - m]); } void Tarjan(int u,int fa) { dfn[u] = low[u] = ++idx; sta[++top] = u; for(int i = head[u] ; i ; i = E[i].next) { int v = E[i].to; if(v != fa) { if(dfn[v]) low[u] = min(low[u],dfn[v]); else { Tarjan(v,u); if(low[v] >= dfn[u]) { ver.clear(); ++cnt; col[u] = cnt; ver.pb(u); while(1) { int x = sta[top--]; col[x] = cnt; ver.pb(x); if(x == v) break; } int tot = 0; for(auto k : ver) { for(int j = head[k] ; j ; j = E[j].next) { if(col[E[j].to] == cnt) ++tot; } } tot /= 2; if(tot == 1) ans = mul(ans,K); else if(tot == ver.size()) { int t = 0; for(int j = 1 ; j <= tot ; ++j) { t = inc(t,fpow(K,gcd(tot,j))); } t = mul(t,fpow(tot,MOD - 2)); ans = mul(ans,t); } else ans = mul(ans,C(tot + K - 1,K - 1)); } else low[u] = min(low[v],low[u]); } } } } void Solve() { read(N);read(M);read(K); int u,v; for(int i = 1 ;i <= M ; ++i) { read(u);read(v);add(u,v);add(v,u); } fac[0] = 1; for(int i = 1 ; i <= 200; ++i) fac[i] = mul(fac[i - 1],i); invfac[200] = fpow(fac[200],MOD - 2); for(int i = 199 ; i >= 0 ; --i) invfac[i] = mul(invfac[i + 1],i + 1); ans = 1; for(int i = 1 ; i <= N ; ++i) { if(!dfn[i]) Tarjan(i,0); } out(ans);enter; } int main() { #ifdef ivorysi freopen("f1.in","r",stdin); #endif Solve(); return 0; }