April Fools Day Contest
普通に面白かったです。
http://codeforces.com/contest/171
A
サンプルから推測。
#include<iostream> #include<string> using namespace std; int a; string b; int main(){ cin>>a>>b; for(int i = 0,t = 1,l = b.size(); i < l; i++){ a += (b[i]-48)*t; t *= 10; } cout<<a<<endl; }
B
問題文は絵で与えられます。
#include <iostream> using namespace std; long long a;//たぶんオーバーフローしない int main(){ cin>>a; cout<<a*(a-1)*6+1<<endl; return 0; }
C
問題文が問題文に見えると解けない。ソースコードに見えても多分解けない。
D
運
#include <iostream> using namespace std; int t,a[5] = {};//ここに適当に数字入れる int main(){ cin>>t; cout<<a[t-1]<<endl; }
E
言語は特定できたけど、難しすぎる。
引き算したり、mod256したり、反転したりする言語。
F
シーザー暗号だった。単一換字式暗号だと、予想して頻度分析(+単語レベルで見つける)したけど少しだけ時間の無駄だった。プログラミングできるのに手動で解きました...
他の問題の難易度から考えて、ヴィジュネル暗号とかホモフォニック暗号の可能性もあったけど、少しやればtheとかoutputとかprimeが見つかるから、その可能性はすぐに捨てられる。
デバッグにオンライン数列大辞典使いました。(使わなかったら2WA以上してたと思う)
#include <iostream> #include <vector> using namespace std; bool prime[10000000]; bool t[10000000]; vector<int> emirps; bool f(int a){//バグがあるけど、素数しか入れないなら問題ない int c = a; int k = 1; int b = 0; while(k<a)k*=10; k /= 10; while(k){ b += (a%10)*k; a /= 10; k /= 10; } if(!(b%2) || prime[b] || b == c)return false; else { t[b] = true; return true; } } int main(){ for(int i = 3; i < 10000000; i+=2){ if(!prime[i]){ for(int j = i*3; j < 10000000; j += i*2)prime[j] = true; } } for(int i = 13; i < 10000000; i+=2){ if(!prime[i] && (t[i] || f(i)))emirps.push_back(i); } int n; cin>>n; cout<<emirps[n-1]<<endl; return 0; }
G
a3が大きくなると、急に大きくなる。
2 + 3 = 5
14 = 14
17 + 2*18 = 53
まで分かっていたから、解きたかった。
H
実装できそうに無かった。
166位でした。ペナルティが少なかったみたいです。