tozangezan's diary

勝手にソースコードをコピペして利用しないでください。

Codeforces Round #201 (Div. 1)

不思議。

A:GCD求めてほげるだけ。落ちた。

#include<stdio.h>
#include<algorithm>
using namespace std;
int b[100];
int gcd(int a,int b){
	while(b){
		a%=b;
		int c=a;
		a=b;
		b=c;
	}return a;
}
int main(){
	int a;
	scanf("%d",&a);
	for(int i=0;i<a;i++)scanf("%d",b+i);
	int n=b[0];
	int m=b[0]; //ここを本番では0にしたせいで落ちました。
	for(int i=1;i<a;i++){
		n=gcd(n,b[i]);
		m=max(b[i],m);
	}
	if((m/n+a)%2==1)printf("Alice\n");
	else printf("Bob\n");
}

B:文字列の面倒なDP。Failure Linkをもっておいて経路復元する。落ちた。

C:
こちらをご覧ください。
f:id:tozangezan:20130921030950p:plain

こんな感じのコードを数種類生成していました。

#include<stdio.h>
int main(){
	printf("100000\n");
	printf("99999999");
	for(int i=0;i<99999;i++){
		printf(" ");
		printf("%d",100000000+i);
	}printf("\n150000000 149900000\n");
}

本体はこれ。

#include<stdio.h>
#include<algorithm>
#include<queue>
using namespace std;
int b[100000];
int bfs[1000001];
int use[1000001];
int main(){
	int a;
	scanf("%d",&a);
	for(int i=0;i<a;i++)scanf("%d",b+i);
	std::sort(b,b+a);
	int c,d;
	scanf("%d%d",&c,&d);
	int n=c-d+1;
	for(int i=0;i<n;i++)use[i]=i+1+d;
	for(int i=0;i<a;i++){
		if(i&&b[i]==b[i-1])continue;
		int t=(d%b[i]==0)?d:(d+b[i]-d%b[i]);
		while(t<=c){
			use[t-d]=max(use[t-d],t+b[i]-1);
			t+=b[i];
		}
	}
	for(int i=1;i<n;i++){
		use[i]=max(use[i],use[i-1]);
	//	printf("%d: %d\n",i+d,use[i]);
	}
	int at=d;
	int ret=0;
	while(at<c){
		at=use[at-d];
//		printf("%d\n",at);
		ret++;
	}
	printf("%d\n",ret);
}

D,E:知らぬ

0 + 0 + 1200 + 0 + 0 + (1000 - 150) = 2050 (53rd)

Rating: 1727 -> 1909 (+182)
ファッ!?