SRM558, ARC009, CF146

週末のコンテスト3連発。

  • TC

easyに時間かけすぎってそれ一番言われてるから(時間あったらmedはとけた)

210位。屑。でもレートは上がる。

rate:1330->1438(+108)

  • ARC

Dむずい。というか10^11くらいの解法しか思いつかない。

CはOEISした(屑)

14位。日本のコンテストだから普通かなぁ。

rateがいつの間にかついてて、1836だった。実力より高い。まあたくさん出てるし仕方ないね。

  • CF

Aはとりあえず確実に通してhackゲーだと思ったらすでにとられてて絶望した。

Bわからないなぁってなってて、でも最終的にわかって通せたので満足。B19行でかけるのにむずいとかWJMZBMRやばすぎ。

C~Eは無理。

結局58位。わーい。

rate:1843->1949(+106) 初めての黄色!!!


以下ソース

  • TC easy
#include<stdio.h>
#include "stdafx.h"
#include<vector>
#include<algorithm>
#include<string>
#include<iostream>
#include<set>
using namespace std;
//class Stamp
//{
//public:
	int getMinimumCost(string str,int lcost,int ccost)
	{
		int mini=1000000000;
		for(int i=1;i<=str.size();i++)
		{
			int sum=i*lcost;
			int dp[51];
			fill(dp,dp+51,1000000000);
			dp[0]=0;
			bool han=true;
			for(int j=1;j<=str.size();j++)
			{
				set<char>se;
				if(j<i)
				{
					continue;
				}
				int gen=0;
				for(int k=j-1;k>=0;k--)
				{
					if(str[k]!='*')
					{
						se.insert(str[k]);
					}
					if(se.size()>1)
					{
						gen=k+1;
						break;
					}
				}
				if(j-gen<i)
				{
					continue;
				}
				if(se.empty())
				{
					dp[j]=((j-1)/i+1)*ccost;
				}
				for(int k=j-i;k>=gen;k--)
				{
					dp[j]=min(dp[j],dp[k]+((j-k-1)/i+1)*ccost);
				}
			}
			mini=min(mini,sum+dp[str.size()]);
		}
		return mini;
	}/*
};*/
int main()
{
	string zan;
	cin>>zan;
	int a,b;
	scanf("%d%d",&a,&b);
	printf("%d\n",getMinimumCost(zan,a,b));
}
  • ARC

A

#include<stdio.h>
#include "stdafx.h"
int main()
{
	int num;
	scanf("%d",&num);
	int sum=0;
	for(int i=0;i<num;i++)
	{
		int a,b;
		scanf("%d%d",&a,&b);
		sum+=a*b;
	}
	printf("%d\n",sum*21/20);
}

B

#include<stdio.h>
#include "stdafx.h"
#include<vector>
#include<algorithm>
#include<string>
#include<iostream>
using namespace std;
typedef long long ll;
int dat[10];
ll hen(string str)
{
	ll ret=0;
	for(int i=0;i<str.size();i++)
	{
		ret*=10;
		ret+=dat[str[i]-'0'];
	}
	return ret;
}
typedef pair<ll,string>pii;
int main()
{
	for(int i=0;i<10;i++)
	{
		int zan;
		scanf("%d",&zan);
		dat[zan]=i;
	}
	vector<pii>vec;
	int num;
	scanf("%d",&num);
	for(int i=0;i<num;i++)
	{
		string zan;
		cin>>zan;
		vec.push_back(make_pair(hen(zan),zan));
	}
	sort(vec.begin(),vec.end());
	for(int i=0;i<num;i++)
	{
		cout<<vec[i].second<<endl;
	}
}

C

#include<stdio.h>
#include "stdafx.h"
#include<vector>
#include<algorithm>
using namespace std;
typedef long long ll;
ll mod=1777777777;
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);
}
ll kai[1000001];
void calc()
{
	kai[0]=1;
	for(int i=1;i<=1000000;i++)
	{
		kai[i]=kai[i-1]*i;
		kai[i]%=mod;
	}
}
ll com(ll a,ll b)
{
	ll ret=kai[a];
	ret*=inv(kai[b]);
	ret%=mod;
	ret*=inv(kai[a-b]);
	ret%=mod;
	return ret;
}
ll dp[1000000];
int main()
{
	calc();
	ll a,b;
	scanf("%lld%lld",&a,&b);
	dp[0]=1;
	dp[1]=0;
	ll ret=1;
	for(ll i=a-b+1;i<=a;i++)
	{
		ret*=(i%mod);
		ret%=mod;
	}
	for(int i=1;i<=b;i++)
	{
		ret*=inv(i);
		ret%=mod;
	}
	for(ll i=2;i<=b;i++)
	{
		dp[i]=((i-1)*(dp[i-1]+dp[i-2]))%mod;
	}
	printf("%lld\n",(ret*dp[b])%mod);
}
  • CF

A

#include<stdio.h>
#include"stdafx.h"
#include<vector>
#include<algorithm>
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b)
{
	for(;;)
	{
		if(a<b)
		{
			swap(a,b);
		}
		if(a%b==0)
		{
			return b;
		}
		a%=b;
	}
}
int main()
{
	ll a=10;
	int b=1000000,c=10000000;
	ll p=b/a*c;
	printf("%lld\n",p);
	ll num;
	scanf("%I64d",&num);
	ll maxi=1;
	ll low=1;
	for(ll i=num-2;i>=1;i--)
	{
		if(gcd(num,i)==1)
		{
			low=i;
			break;
		}
	}
	for(ll i=low;i<=num;i++)
	{
		for(ll j=low;j<=num;j++)
		{
			for(ll k=low;k<=num;k++)
			{
				ll zan=i*j/gcd(i,j);
				maxi=max(maxi,zan*k/gcd(zan,k));
			}
		}
	}
	printf("%I64d\n",maxi);
}

B

#include<stdio.h>
#include "stdafx.h"
#include<vector>
#include<algorithm>
using namespace std;
double dp[100001];
int main()
{
	int num;
	scanf("%d",&num);
	double ans=0.0;
	for(int i=0;i<num;i++)
	{
		double zan;
		scanf("%lf",&zan);
		dp[i+1]=(dp[i]+1.0)*zan;
		ans+=(dp[i]*2+1.0)*zan;
	}
	printf("%.10lf\n",ans);
}

CF-B短すぎってそれ一番言われてるから