予鈴

アウトプットとメモ書きの中間みたいな記事がたくさん出ます。

RUPC 2017 参加記

 

0日目

基本的に事務的な準備をしてました。

問題文や解法の議論に全く参加できなかったので、来年はそういう積極的に参加したい。

 

 

1日目

立命セットだったので、基本的にイスに座ってFAを記録したり、風船係をしてました。懇親会では、会津合宿のときにチームを組んだ somennagasiさんや学生ではない競プロerさんと、新歓の話やプログラミングの話をした。*1

食事が美味しくてびっくりした。

余談ですが、会場に向かっている間に、gccを吹き飛ばす*2という事件がありました。

 

 

 

2日目

NCA***さんとmkanさんで、チームGumikanstarで参加しました。

NCA***さんがC、mkanさんがA,僕がB問題を担当しました。

Bがさっと解けそう*3だったので、mkanさんの考察を手伝っている間にNCA***さんがC問題を通す(プロ)。

なんとかB問題を2WAしながら通したものの、その後は全くチームの役に立てずに死亡。

結果はB,C,Eの3完でした。

 

Aが本当に辛かったです。

コンテスト後の懇親会ではいろんな大学の競プロerさんとお話することができて、とても楽しかったです。

 

3日目

Yang33さんとGachoさんとチーム名Gachofriendsで参加しました。

Yang33さんがA問題、僕がB問題、GachoさんがC問題を担当しました。

A問題をYang33がすごいスピードでAC、僕の考察が行き詰まっていたので手伝ってもらいました。

解法はわかったものの、僕の実装力がなさすぎてYang33さんと一緒に実装することに。

コード量が爆発しそう&&バグが発生したので、C,Dを通したGachoさんと合流し3人で解いて無事AC。

結果はA~Dの4完でした。完全に戦犯で悲しい。

 

まとめ 

前回の会津合宿のときよりは、少し成長したかな?と思った反面、実装力、考察力不足を痛感する合宿でした。

これからも精進していきます。

次の合宿では人狼がしたいと思いました。

 

 

 

 

 

 

 

*1:実際に仕事でプログラミングをしている方の話を聞いたことが殆どなかったので、とても良い経験になった。

*2:雰囲気でネットに転がっているコマンドを貼るのは危険です。

*3:誤読してたので

ABC C - Factors of Factorial

N!の約数の個数を数える問題。
 2 \leq i  \leq Nの数字を片っ端から素数で割っていく。
 indeは添字に素数を持ち、N!の素因数の数を持つ。
 indeの値を初めて更新するとき( inde=0)は、 (prime) ^0が含まれるからans = 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 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

制約が1 \leq N \leq 8だったので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で割った値をsumに足す。
sumを2で割ると"偶数のペア"の数がわかるから、奇数にいくつ肉付けできるかがわかる。
(イメージは、奇数は(1+偶数)になっているから、'偶数'をすべて sumに足す。 sum / ki_sizeで再分配するペアに数がわかる。)
最後の+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;
}