Codeforces #138

Codeforces #138(Div 1)の参加記。

  • コンテストが始まる。A読む。苦手な類の文字列操作。
  • わからない。
  • とりあえずわかった気になって書く。
  • バグる。どうしようもないことに気付く。
  • とりあえずあきらめてB読む。
  • すごく楽しそう。これは解きたい。
  • 5分くらいで思いつく。尺取&各文字についてimos法でいける。
  • pretestとおる。
  • C読む。
  • ん?combinationを順番に求めていくだけじゃ...
  • 10^9+2000>1000000007に気付いて一瞬焦る。
  • でも分母にはそんなのは来ないから大丈夫だよね->実装する
  • 動く。出す。
  • Wrong answer on pretest 9
  • modを一か所取り忘れている。
  • pretest通る。
  • Aはわからないのでhackに逃げる。
  • hackしようと思ったものの落ちそうなケースとか思いつかない。
  • D,Eがこの時点で誰にも解かれていない。やばすぎる。
  • でもA解けないのでD読む。幾何だ。やめよう。
  • E読む。明らかにやばい。
  • Aに戻って考える。
  • コードを複雑にする作業を繰り返すといい感じになる。
  • Wrong answer on pretest 4
  • バグ見つける。
  • Wrong answer on pretest 11
  • バグ見つける。
  • Wrong answer on pretest 11
  • 諦めphase
  • コンテスト終了
  • systestちゃんと通る。


結果、BCを解くのがある程度速かったようで80位だった。Div1過去最高順位なのでうれしい。
個人的にBはすごく良問だと思う。
結局DEは解かれなかった。やばい。
rating: 1722->1843(+121). highest.わーい。

難易度は明らかにC

#include<stdio.h>
#include<vector>
#include<string>
#include<algorithm>
#include<iostream>
using namespace std;
int imo[26][200001];
int main()
{
	string str,mok;
	cin>>str>>mok;
	for(int i=0;i<26;i++)
	{
		for(int j=0;j<str.size()+1;j++)
		{
			imo[i][j]=0;
		}
	}
	int pt=0;
	for(int i=0;i<mok.size();i++)
	{
		for(;;)
		{
			if(pt>=str.size())
			{
				printf("No\n");
				return 0;
			}
			if(str[pt]==mok[i])
			{
				imo[str[pt]-'a'][pt]++;
				pt++;
				break;
			}
			pt++;
		}
	}
	pt=str.size()-1;
	for(int i=mok.size()-1;i>=0;i--)
	{
		for(;;)
		{
			if(pt<0)
			{
				printf("No\n");
				return 0;
			}
			if(str[pt]==mok[i])
			{
				imo[str[pt]-'a'][pt+1]--;
				pt--;
				break;
			}
			pt--;
		}
	}
	for(int i=0;i<26;i++)
	{
		for(int j=1;j<=str.size();j++)
		{
			imo[i][j]+=imo[i][j-1];
		}
	}
	bool han=true;
	for(int i=0;i<str.size();i++)
	{
		if(imo[str[i]-'a'][i]<=0)
		{
			han=false;
		}
	}
	if(han)
	{
		printf("Yes\n");
	}
	else
	{
		printf("No\n");
	}
}

C

#include<stdio.h>
#include"stdafx.h"
#include<vector>
#include<algorithm>
using namespace std;
typedef long long ll;
ll mod=1000000007;
ll po(ll a,ll b)
{
	vector<int>vec;
	for(;;)
	{
		if(b==0)
		{
			break;
		}
		vec.push_back(b%2);
		b/=2;
	}
	reverse(vec.begin(),vec.end());
	ll ret=1;
	for(int i=0;i<vec.size();i++)
	{
		ret*=ret;
		ret%=mod;
		if(vec[i])
		{
			ret*=a;
			ret%=mod;
		}
	}
	return ret;
}
ll inv(ll a)
{
	return po(a,mod-2);
}
int main()
{
	int num,kai;
	scanf("%d%d",&num,&kai);
	kai--;
	vector<ll>vec;
	for(int i=0;i<num;i++)
	{
		ll zan;
		scanf("%I64d",&zan);
		vec.push_back(zan);
	}
	vector<ll>tims;
	tims.push_back(1);
	ll now=1;
	for(int i=1;i<num;i++)
	{
		now*=(kai+i);
		now%=mod;
		now*=inv(i);
		now%=mod;
		tims.push_back(now);
	}
	vector<ll>ret;
	for(int i=0;i<num;i++)
	{
		ll sum=0;
		for(int j=i;j>=0;j--)
		{
			sum+=(tims[j]*vec[i-j])%mod;
			sum%=mod;
		}
		if(i!=0)
		{
			printf(" ");
		}
		printf("%I64d",sum);
	}
	printf("\n");
}