国内予選のぷろぐらむ
貼ってみたりする.Eはもはや説明不要(能).
- A
これは素直に.
#include <iostream> #include <algorithm> #include <vector> #include <cmath> #define MAX 1000000 using namespace std; vector<bool> prime(MAX + 1, true); int a, d, n; void sieve() { int i, j, limit; fill(prime.begin(), prime.end(), true); limit = (int)sqrt((double)(MAX)); prime[1] = false; for(int i = 4; i <= MAX ; i+=2) { prime[i] = false; } for(int i = 3 ; i <= limit ; i += 2) { if(prime[i]) { for(int j = i ; i * j <= MAX ; j+=2) { prime[i * j] = false; } } } } int main() { sieve(); while(cin >> a >> d >> n, a || d || n) { int counter = 0; for(int i = a ; true ; i += d) { if(prime[i]) { counter++; if(counter == n) { cout << i << endl; break; } } } } }
- B
C-kとC-yで.これはもっと綺麗に書けると思うけど,まあオレはこんなもんです.
#include <iostream> #include <algorithm> #include <vector> #include <cmath> #include <string> using namespace std; int tc, counter; string in; vector< vector<char> > tbl; void func(vector<char> &a, vector<char> &b) { vector<char> k; // normal for(int i = 0 ; i < a.size() ; i++) k.push_back(a[i]); for(int i = 0 ; i < b.size() ; i++) k.push_back(b[i]); if(find(tbl.begin(), tbl.end(), k) == tbl.end()) { counter++; tbl.push_back(k); } // a reverse k.clear(); reverse(a.begin(), a.end()); for(int i = 0 ; i < a.size() ; i++) k.push_back(a[i]); for(int i = 0 ; i < b.size() ; i++) k.push_back(b[i]); if(find(tbl.begin(), tbl.end(), k) == tbl.end()) { counter++; tbl.push_back(k); } // ab reverse k.clear(); reverse(b.begin(), b.end()); for(int i = 0 ; i < a.size() ; i++) k.push_back(a[i]); for(int i = 0 ; i < b.size() ; i++) k.push_back(b[i]); if(find(tbl.begin(), tbl.end(), k) == tbl.end()) { counter++; tbl.push_back(k); } // b reverse k.clear(); reverse(a.begin(), a.end()); for(int i = 0 ; i < a.size() ; i++) k.push_back(a[i]); for(int i = 0 ; i < b.size() ; i++) k.push_back(b[i]); if(find(tbl.begin(), tbl.end(), k) == tbl.end()) { counter++; tbl.push_back(k); } } void solve() { counter = 0; tbl.clear(); for(int k = 1 ; k < in.size() ; k++) { vector<char> a, b; for(int i = 0 ; i < k ; i++) a.push_back(in[i]); for(int i = k ; i < in.size() ; i++) b.push_back(in[i]); func(a, b); func(b, a); } cout << counter << endl; } int main() { cin >> tc; while(tc--) { cin >> in; if(in.size() == 1) { cout << 1 << endl; } else { solve(); } } }
- D
バックトラック.氷で滑ったりブロック消したりがちょっと複雑かな?
#include <iostream> #include <algorithm> #include <vector> #include <cmath> #define MAX 20 using namespace std; int w, h; int tbl[MAX][MAX]; int p, q, a, b; int move[] = {-1,0,1,0,0,-1,0,1}; int result; void solve(int index, int aa, int bb) { if(index == 11) { return; } for(int i = 0 ; i < 4 ; i++) { int ii = aa, jj = bb; if(tbl[ii + move[i * 2]][jj + move[i * 2 + 1]] == 1) continue; while(true) { if(ii < 0 || ii >= h || jj < 0 || jj >= w) { break; } else if(tbl[ii][jj] == 3) { result = min(result, index); break; } else if(tbl[ii][jj] == 1) { tbl[ii][jj] = 0; ii -= move[i * 2]; jj -= move[i * 2 + 1]; solve(index + 1, ii, jj); tbl[ii + move[i * 2]][jj + move[i * 2 + 1]] = 1; break; } ii = ii + move[i * 2]; jj = jj + move[i * 2 + 1]; } } } int main() { while(cin >> w >> h, w || h) { for(int i = 0 ; i < h ; i++) { for(int j = 0 ; j < w ; j++) { cin >> tbl[i][j]; if(tbl[i][j] == 2) { p = i; q = j; } else if(tbl[i][j] == 3) { a = i; b = j; } } } solve(1, p, q); if(result == 20) cout << -1 << endl; else cout << result << endl; } }
- E
出ました.何だこれは・・・.一晩経って見てみると,自分でもよく分からないコードになっちょる.
#include <iostream> #include <algorithm> #include <vector> #include <cmath> #include <string> #include <cctype> #define MAX 1000000 using namespace std; int n, ii; int ss; vector<char> solve(string &in, int p, bool flag) { vector<char> r; while(ii < in.size() - 1 && (flag || (p && flag == false))) { int a = 0; if(isdigit(in[ii])) { while(isdigit(in[ii++])) { a *= 10; a += (in[ii - 1] - '0'); } ii--; if(in[ii] == '(') { ii++; vector<char> tmp = solve(in, 1, false); ii++; for(int i = 0 ; i < a ; i++) { for(int j = 0 ; j < tmp.size() ; j++) { r.push_back(tmp[j]); if(r.size() >= n + 100) return r; } } } else { for(int i = 0 ; i < a ; i++) r.push_back(in[ii]); ii++; } } else { while(ii < in.size() && in[ii] != ')' && !isdigit(in[ii])) r.push_back(in[ii++]); if(in[ii] == ')') p--; if(isdigit(in[ii])) { vector<char> tmp = solve(in, 0, false); for(int i = 0 ; i < a ; i++) { for(int j = 0 ; j < tmp.size() ; j++) { r.push_back(tmp[j]); ss++; if(r.size() >= n + 100) return r; } } } if(p == 0 && flag == false) return r; } if(in[ii] == ')') p--; } return r; } int main() { string in; while(cin >> in >> n, in != "0" || n) { ii = 0; ss = 0; in.push_back(')'); vector<char> rr = solve(in, 1, true); if(ss < n + 100 && n >= rr.size()) cout << 0 << endl; else cout << rr[n] << endl; } }