tozangezan's diary

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

SRM 704

7ヶ月ぶりにTopCoderに出た。

300:
これはAGC005のCと全く同じ。

// I like wolves!!
#include <vector>
#include <map>
#include <set>
#include <deque>
#include <stack>
#include <bitset>
#include <algorithm>
#include <sstream>
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <queue>
#include <string.h>
#include <complex>
using namespace std;
 
class TreeDistanceConstruction {
	public:
	int v[110];
	int e[110];
	vector <int> construct(vector <int> d) {
		int n=d.size();
		int c=0;
		for(int i=0;i<110;i++)v[i]=0;
		for(int i=0;i<n;i++)c=max(c,d[i]);
		int cnt=0;
		for(int i=0;i<n;i++)if(c==d[i])cnt++;
		if(cnt==1)return vector<int>(0);
		int D=99999999;
		for(int i=0;i<=c;i++){
			int tmp=c-min(i,c-i);
			D=min(D,tmp);
			bool ok=false;
			for(int j=0;j<n;j++){
				if(v[j])continue;
				if(d[j]==tmp){
					v[j]=1;
					ok=true;
					e[i]=j;
					break;
				}
			}
			if(!ok)return vector<int>(0);
		}
		vector<int>ret;
		for(int i=0;i<c;i++){
			ret.push_back(e[i]);
			ret.push_back(e[i+1]);
		}
		for(int i=0;i<n;i++){
			if(v[i])continue;
			if(d[i]<=D)return vector<int>(0);
			bool ok=false;
			for(int j=0;j<=c;j++){
				if(d[e[j]]+1==d[i]){
					v[i]=1;
					ret.push_back(e[j]);
					ret.push_back(i);
					ok=true;break;
				}
			}
			if(!ok)return vector<int>(0);
		}
		return ret;
	}
<%:testing-code%>};
//Powered by KawigiEdit 2.1.4 (beta) modified by pivanof!

500:
DDCCの予選にもあった方針。

// I like wolves!!
#include <vector>
#include <map>
#include <set>
#include <deque>
#include <stack>
#include <bitset>
#include <algorithm>
#include <sstream>
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <queue>
#include <string.h>
#include <complex>
using namespace std;
const long long mod=1000000007;
class ModEquation {
	public:
	int dp[3000];
	long long dp2[52][3000];
	int to[2500][2500];
	long long pw(long long a,long long b){
		long long ret=1;
		while(b){
			if(b%2)ret=ret*a%mod;
			b/=2;
			a=a*a%mod;
		}
		return ret;
	}
	long long gcd(long long a,long long b){
		while(a){
			b%=a;swap(a,b);
		}
		return b;
	}
	vector <int> count(int n, int K, vector <int> query) {
		vector<int>y;
		for(int i=1;i*i<=K;i++){
			if(K%i==0){
				y.push_back(i);
				if(i*i<K)y.push_back(K/i);
			}
		}
		std::sort(y.begin(),y.end());
		int sz=y.size();
		for(int i=sz-1;i>=0;i--){
			dp[i]=K/y[i];
			for(int j=i+1;j<sz;j++)if(y[j]%y[i]==0)dp[i]-=dp[j];
		}
		for(int i=0;i<52;i++)for(int j=0;j<3000;j++)
			dp2[i][j]=0;
		dp2[0][0]=1;
		for(int i=0;i<sz;i++)for(int j=0;j<sz;j++){
			long long f=gcd((long long)y[i]*y[j],K);
			to[i][j]=lower_bound(y.begin(),y.end(),(int)f)-y.begin();
		//	printf("%d %d: %d\n",i,j,to[i][j]);
		}
		
		for(int i=0;i<n;i++){
			for(int j=0;j<sz;j++){
				if(!dp2[i][j])continue;
				for(int k=0;k<sz;k++){
					dp2[i+1][to[j][k]]=(dp2[i+1][to[j][k]]+dp2[i][j]*dp[k])%mod;
				}
			}
		}
		vector<int>ret;
		for(int i=0;i<query.size();i++){
			int t=lower_bound(y.begin(),y.end(),gcd(K,query[i]))-y.begin();
			long long ks=dp2[n][t];
		//	printf("%d %lld\n",t,ks);
			ks=ks*pw(dp[t],mod-2)%mod;
			ret.push_back(ks);
		}
		return ret;
	}
<%:testing-code%>};
//Powered by KawigiEdit 2.1.4 (beta) modified by pivanof!

800:
実装要素がほとんどなくて見つけたら勝ちみたいな問題だった。そういうのは大概見つけられないので詰む。

Challenge:
するメリットがなかった。

270.54 + 367.54 + 0 + 0 = 638.08 (6th)
Rating: 2489 -> 2606

事故らなければ地道に上がっていくタイプのコンテストだし、事故らなければまだまだ上がる。