【Plan 第八場】


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

看不懂,也沒找到翻譯= =



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章