RUPC 2017 参加記
0日目
基本的に事務的な準備をしてました。
問題文や解法の議論に全く参加できなかったので、来年はそういう積極的に参加したい。
さて、明日のコンテストは立命勢の日ですが今年はなんと阪大勢とのコラボです!!☺️そしていつもよりコンテストが1時間長いです...!!果たして何問コンテストなのでしょうか〜!(知ってる顔
1日目
立命セットだったので、基本的にイスに座ってFAを記録したり、風船係をしてました。懇親会では、会津合宿のときにチームを組んだ somennagasiさんや学生ではない競プロerさんと、新歓の話やプログラミングの話をした。*1
食事が美味しくてびっくりした。
余談ですが、会場に向かっている間に、gccを吹き飛ばす*2という事件がありました。
大変なことになりました。 pic.twitter.com/CPGT1xNXhT
2日目
NCA***さんとmkanさんで、チームGumikanstarで参加しました。
NCA***さんがC、mkanさんがA,僕がB問題を担当しました。
Bがさっと解けそう*3だったので、mkanさんの考察を手伝っている間にNCA***さんがC問題を通す(プロ)。
なんとかB問題を2WAしながら通したものの、その後は全くチームの役に立てずに死亡。
結果はB,C,Eの3完でした。
念のために0.001刻みでループを回しました。#RUPC2017
— yebi (@sigsigma19) 2017年3月23日
Aが本当に辛かったです。
コンテスト後の懇親会ではいろんな大学の競プロerさんとお話することができて、とても楽しかったです。
3日目
Yang33さんとGachoさんとチーム名Gachofriendsで参加しました。
Yang33さんがA問題、僕がB問題、GachoさんがC問題を担当しました。
A問題をYang33がすごいスピードでAC、僕の考察が行き詰まっていたので手伝ってもらいました。
解法はわかったものの、僕の実装力がなさすぎてYang33さんと一緒に実装することに。
コード量が爆発しそう&&バグが発生したので、C,Dを通したGachoさんと合流し3人で解いて無事AC。
結果はA~Dの4完でした。完全に戦犯で悲しい。
まとめ
前回の会津合宿のときよりは、少し成長したかな?と思った反面、実装力、考察力不足を痛感する合宿でした。
これからも精進していきます。
次の合宿では人狼がしたいと思いました。
ABC C - Factors of Factorial
N!の約数の個数を数える問題。
の数字を片っ端から素数で割っていく。
は添字に素数を持ち、N!の素因数の数を持つ。
の値を初めて更新するとき()は、が含まれるからにしてる。
#include<iostream> #include<string> #include<cstdio> #include<algorithm> #include<stack> #include<queue> #include<vector> #include<cmath> #include<utility> #include<set> #include<complex> #include<map> #define vi vector<int> #define vvi vector<vector<int> > #define ll long long int #define vl vector<ll> #define vvl vector<vector<ll>> #define vb vector<bool> #define vc vector<char> #define vs vector<string> #define ld long double #define INF 1e9 #define EPS 0.0000000001 #define rep(i,n) for(int i=0;i<n;i++) #define loop(i,s,n) for(int i=s;i<n;i++) #define all(in) in.begin(), in.end() #define MAX 1e4 #define MOD 1000000007 using namespace std; typedef pair<int, int> pii; typedef pair<double,double>pdd; typedef pair<ll,ll>pll; vi inde(MAX,0); ll cal(int num, int div){ int ans=1; while(true){ if(num%div==0){num/=div; ans++;} else break; } if(!inde[div])inde[div]+=ans; else inde[div]+=ans-1; return 0; } int main(){ vector<bool>Primecheck(MAX+1,true); vector<int>Primenumber(MAX+1,0); int Primecounter =0; for(int i = 2; i<MAX+1;i++){ if(Primecheck[i]){ for(int j = 2;i*j<MAX;j++) Primecheck[i*j] = false; Primenumber[Primecounter] = i; Primecounter++; } } ll num; cin>>num; ll ans=1; for(int n=(int)num; n>1; n--){ for(int i=0; i<Primecounter;i++){ if(Primenumber[i]>n)break; if(n%Primenumber[i]==0){cal(n,Primenumber[i]);} } } for(int i=0; i<num+1; i++){ if(inde[i]){ans*=inde[i]; ans%=MOD;} } cout<<ans<<endl; }
ABC C-Brute-force Attack
制約がだったのでnext_permutationだと思ったけど違った。
再起できれいに書けてAC。辞書順ってところに時間を取られすぎてしまった…
#include<iostream> #include<string> #include<cstdio> #include<algorithm> #include<stack> #include<queue> #include<vector> #include<cmath> #include<utility> #include<set> #include<complex> #include<map> #define vi vector<int> #define vvi vector<vector<int> > #define ll long long int #define vl vector<ll> #define vvl vector<vector<ll>> #define vb vector<bool> #define vc vector<char> #define vs vector<string> #define ld long double #define INF 1e9 #define EPS 0.0000000001 #define rep(i,n) for(int i=0;i<n;i++) #define loop(i,s,n) for(int i=s;i<n;i++) #define all(in) in.begin(), in.end() #define MAX 9999999 using namespace std; typedef pair<int, int> pii; typedef pair<double,double>pdd; typedef pair<ll,ll>pll; string key="abc"; int lim; void solve(string s){ if(s.size()==lim){cout<<s<<endl;; return ;} rep(i,3){string temp=s; temp+=key[i]; solve(temp);} return; } int main(){ cin>>lim; string s; solve(s); }
ARCのB :回文分割
個人的にすごく苦しんだ。(同期はプログラミング始めて二ヶ月でACしてる)
偶奇に分けて、奇数なら2で割った値をに足す。
を2で割ると"偶数のペア"の数がわかるから、奇数にいくつ肉付けできるかがわかる。
(イメージは、奇数は(1+偶数)になっているから、'偶数'をすべてに足す。で再分配するペアに数がわかる。)
最後のは余り
#include<iostream> #include<string> #include<cstdio> #include<algorithm> #include<stack> #include<queue> #include<vector> #include<cmath> #include<utility> #include<set> #include<complex> #include<map> #define vi vector<int> #define vvi vector<vector<int> > #define ll long long int #define vl vector<ll> #define vvl vector<vector<ll>> #define vb vector<bool> #define vc vector<char> #define vs vector<string> #define ld long double #define INF 1e9 #define EPS 0.0000000001 #define rep(i,n) for(int i=0;i<n;i++) #define loop(i,s,n) for(int i=s;i<n;i++) #define all(in) in.begin(), in.end() #define MAX 9999999 using namespace std; typedef pair<int, int> pii; int main(){ string s;cin>>s; vi v(26,0);rep(i,s.size())v[s[i]-'a']++; int sum=0,ki_size=0; rep(i,26){ if(v[i]==0)continue; if(!(v[i]%2))sum+=v[i]; else { sum+=(2*(v[i]/2)); ki_size++; } } sum=sum/2; if(ki_size)cout<<2*(sum/ki_size)+1<<endl; else cout<<s.size()<<endl; }
ブログ始めました。
2017年になったので、ブログをはじめました。
競プロとか英語とかの備忘録になる予定です。