http://codeforces.com/contest/521
隨便找了場最近的CF水了水,我果水
A
送分題
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
#define rep(i,l,r) for(int i=(l),_=(r);i<=_;i++)
#define per(i,r,l) for(int i=(r),_=(l);i>=_;i--)
#define MS(arr,x) memset(arr,x,sizeof(arr))
#define INE(i,u) for(int i=head[u];~i;i=e[i].next)
#define LL long long
inline const int read()
{int r=0,k=1;char c=getchar();for(;c<'0'||c>'9';c=getchar())if(c=='-')k=-1;
for(;c>='0'&&c<='9';c=getchar())r=r*10+c-'0';return k*r;}
////////////////////////////////////////////////
int n;
char s[100010];
int A,T,C,G;
////////////////////////////////////////////////
LL pow_mod(LL a,LL b,LL p){LL t=1;for(;b;b>>=1,a=a*a%p)if(b&1)t=t*a%p;return t;}
////////////////////////////////////////////////
void input()
{
n=read();
scanf("%s",s+1);
}
void solve()
{
rep(i,1,n)
{
if(s[i] == 'A') A++;
else if(s[i] == 'T') T++;
else if(s[i] == 'C') C++;
else G++;
}
int mx=A;
mx=max(mx,T);
mx=max(mx,C);
mx=max(mx,G);
int cnt=0;
if(mx == A) cnt++;
if(mx == T) cnt++;
if(mx == C) cnt++;
if(mx == G) cnt++;
cout<<pow_mod(cnt,n,1000000007LL)<<endl;
}
////////////////////////////////////////////////
int main()
{
//freopen("_.in","r",stdin); freopen("_.out","w",stdout);
input(),solve();
return 0;
}
B
水到爆的貪心#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <set>
#include <map>
using namespace std;
#define rep(i,l,r) for(int i=(l),_=(r);i<=_;i++)
#define per(i,r,l) for(int i=(r),_=(l);i>=_;i--)
#define MS(arr,x) memset(arr,x,sizeof(arr))
#define INE(i,u) for(int i=head[u];~i;i=e[i].next)
#define LL long long
#define pii pair<int,int>
#define X first
#define Y second
#define MP make_pair
inline const int read()
{int r=0,k=1;char c=getchar();for(;c<'0'||c>'9';c=getchar())if(c=='-')k=-1;
for(;c>='0'&&c<='9';c=getchar())r=r*10+c-'0';return k*r;}
////////////////////////////////////////////////
const LL mod=1000000009;
int n;
pii a[100010];
map<pii,int>M;
set<int>S;
////////////////////////////////////////////////
void update(int o)
{
int x=a[o].X,y=a[o].Y;
bool ok=1;
rep(i,-1,1) if(M.count(MP(x+i,y+1)))
{
if(M.count(MP(x+i-1,y)) + M.count(MP(x+i,y)) + M.count(MP(x+i+1,y)) == 1) ok=0;
}
if(ok) S.insert(o);
else S.erase(o);
}
////////////////////////////////////////////////
void input()
{
n=read();
rep(i,0,n-1)
{
int x=read(),y=read();
a[i].X=x; a[i].Y=y;
M[MP(x,y)]=i;
}
rep(i,0,n-1) update(i);
}
void solve()
{
LL ans=0;
rep(i,1,n)
{
int o;
if(i&1) o=*S.rbegin();
else o=*S.begin();
S.erase(o);
ans=(ans*n+o)%mod;
//printf("%d ",o);
M.erase(MP(a[o].X,a[o].Y));
rep(i,-2,2) if(M.count(MP(a[o].X+i,a[o].Y))) update(M[MP(a[o].X+i,a[o].Y)]);
rep(i,-1,1) if(M.count(MP(a[o].X+i,a[o].Y-1))) update(M[MP(a[o].X+i,a[o].Y-1)]);
}
cout<<ans<<endl;
}
////////////////////////////////////////////////
int main()
{
//freopen("_.in","r",stdin); freopen("_.out","w",stdout);
input(),solve();
return 0;
}
C
對每一位計算其貢獻,可以發現這樣做比較困難
難點在於對於不同的長度,其貢獻是不同的
所以每次考慮同一個長度,這樣就容易統計了
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
#define rep(i,l,r) for(int i=(l),_=(r);i<=_;i++)
#define per(i,r,l) for(int i=(r),_=(l);i>=_;i--)
#define MS(arr,x) memset(arr,x,sizeof(arr))
#define INE(i,u) for(int i=head[u];~i;i=e[i].next)
#define LL long long
inline const int read()
{int r=0,k=1;char c=getchar();for(;c<'0'||c>'9';c=getchar())if(c=='-')k=-1;
for(;c>='0'&&c<='9';c=getchar())r=r*10+c-'0';return k*r;}
////////////////////////////////////////////////
const LL mod=1000000007;
int n,k;
char s[100010];
LL fac[100010],inv[100010],facv[100010],pow10[100010];
int a[100010],sum[100010];
////////////////////////////////////////////////
LL pow_mod(LL a,LL b,LL p){LL t=1;for(;b;b>>=1,a=a*a%p)if(b&1)t=t*a%p;return t;}
LL C(int n,int m)
{
if(m>n || m<0) return 0;
return fac[n]*facv[m]%mod*facv[n-m]%mod;
}
////////////////////////////////////////////////
void input()
{
n=read(); k=read();
scanf("%s",s+1);
rep(i,1,n) a[i]=s[i]-'0',sum[i]=sum[i-1]+a[i];
}
void solve()
{
inv[0]=inv[1]=1; fac[0]=1; facv[0]=1; pow10[0]=1;
rep(i,1,100000)
{
if(i>1) inv[i]=inv[mod%i]*(mod-mod/i)%mod;
fac[i]=i*fac[i-1]%mod;
facv[i]=facv[i-1]*inv[i]%mod;
pow10[i]=pow10[i-1]*10%mod;
}
LL ans=0,t;
rep(i,1,n-k)
{
t=(LL)sum[n-i]*pow10[i-1]%mod;
t=t*C(n-i-1,k-1)%mod;
ans+=t;
if(ans>=mod) ans-=mod;
t=(LL)a[n-i+1]*pow10[i-1]%mod;
t=t*C(n-i,k)%mod;
ans+=t;
if(ans>=mod) ans-=mod;
}
cout<<ans<<endl;
}
////////////////////////////////////////////////
int main()
{
//freopen("_.in","r",stdin); freopen("_.out","w",stdout);
input(),solve();
return 0;
}
DE
看不懂,也沒找到翻譯= =