kmjp's blog

競技プログラミング参加記です

VolBIT Formulas Blitz : G-L

少し難しいのもあるけどがんばろう。
http://codeforces.com/contest/630/problem/G
http://codeforces.com/contest/630/problem/H
http://codeforces.com/contest/630/problem/I
http://codeforces.com/contest/630/problem/J
http://codeforces.com/contest/630/problem/K
http://codeforces.com/contest/630/problem/L

G. Challenge Pennants

 {}_N H_5 \times {}_N H_3を答えよう。

ll combi(ll N_, ll C_) {
	ll ret=1;
	int i;
	FOR(i,C_) ret*=N_-i, ret/=(i+1);
	return ret;
}
ll hcomb(int P_,int Q_) { return (P_==0&&Q_==0)?1:combi(P_+Q_-1,Q_);};


void solve() {
	ll N;
	cin>>N;
	
	cout<<hcomb(N,3)*hcomb(N,5)<<endl;
	
}

H. Benches

 ({}_N C_5)^2 \times 5!を答えよう。

void solve() {
	int N,i;
	
	cin>>N;
	ll ret=1;
	FOR(i,5) ret*=N-i;
	FOR(i,5) ret/=(i+1);
	
	ret=ret*ret*120;
	cout<<ret<<endl;
}

I. Parking Lot

N文字同じ場所が続くのは1箇所しかない。

N文字の両隣は残り3種の文字で、それ以外は何でも良い。
N文字の部分が両端にある場合、隣に来る文字は1つである点に注意して数え上げよう。

void solve() {
	ll N,ret=0;
	
	cin>>N;
	//left,right
	ret=2*3*(1LL<<(2*(2*N-2-N-1)));
	//other
	ret+=(N-3)*3*3*(1LL<<(2*(2*N-2-N-2)));
	cout<<4*ret<<endl;
}

J. Divisibility

2~10のLCMは2520なので、N/2520を答えればよい。

void solve() {
	ll N;
	ll r=1;
	
	cin>>N;
	for(ll i=2;i<=10;i++) r=r*i/__gcd(i,r);
	cout<<N/r<<endl;
}

K. Indivisibility

0~2519のうち、何個2520と互いに素な整数があるか数えよう。
その数をdとすると、N/2520*d個と、あとはNを2520で割った余りの分だけ答えに加算する。

void solve() {
	int yes[2540]={};
	int i,x;
	int sum=0;
	for(i=0;i<2520;i++) {
		yes[i]=1;
		for(x=2;x<=10;x++) if(i%x==0) yes[i]=0;
		sum+=yes[i];
	}
	
	ll N;
	cin>>N;
	ll ret = N/2520*sum;
	N%=2520;
	FOR(i,N+1) ret+=yes[i];
	cout<<ret<<endl;
}

I. Parking Lot

オーバーフローしないように、問題文どおり計算するだけ。
答えの出力にLeading zeroを含めるよう注意。

void solve() {
	ll N;
	cin>>N;
	N=N/10000*10000+(N/1000%10)+(N/100%10*1000)+(N/10%10*10)+(N%10*100);
	ll ret=N*N%100000*N%100000*N%100000*N%100000;
	_P("%05d\n",(int)ret);
}

まとめ

ここらへんはまだ難しくない。