結果
問題 | No.28 末尾最適化 |
ユーザー | r_dream0 |
提出日時 | 2017-02-03 01:54:05 |
言語 | C++11 (gcc 11.4.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 1,957 bytes |
コンパイル時間 | 993 ms |
コンパイル使用メモリ | 79,964 KB |
実行使用メモリ | 6,948 KB |
最終ジャッジ日時 | 2024-06-06 12:21:45 |
合計ジャッジ時間 | 2,208 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
コンパイルメッセージ
main.cpp: In function ‘int main()’: main.cpp:81:26: warning: division by zero [-Wdiv-by-zero] 81 | printf("%d\n", t / 0); | ~~^~~ main.cpp:83:26: warning: division by zero [-Wdiv-by-zero] 83 | printf("%d\n", t / 0); | ~~^~~ main.cpp:65:8: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 65 | scanf("%d", &Q); | ~~~~~^~~~~~~~~~ main.cpp:67:10: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 67 | scanf("%ld %d %d %d", &X[0], &N, &K, &B); | ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ソースコード
#include <cstdio> #include <iostream> #include <vector> #include <algorithm> #include <tuple> using namespace std; unsigned long X[100001]; int N, K, B; vector<pair<int,int>> Bs; vector<pair<int,int>> factorize(int n) { vector<pair<int,int>> ret; for(int i = 2; i <= n; i++) { int cnt = 0; while(n % i == 0) { n /= i;cnt++; } if(cnt > 0)ret.emplace_back(i, cnt); } return ret; } void gen_list() { for(int i = 1; i <= N; i++) { X[i] = 1 + ((X[i - 1] + 12345) * X[i - 1]) % 100000009; } } int solve_by_greedy() { vector<vector<long> > Xs(N + 1, vector<long>(3)); for(int i = 0; i <= N; i++) { for(int j = 0; j < 3; j++) { unsigned long tmp2 = X[i]; if(Bs[j].first == 1) { Xs[i][j] = 999999999; }else{ while(tmp2 % Bs[j].first == 0) { tmp2 /= Bs[j].first; Xs[i][j]++; } } } } for(int i = 0; i < 3; i++) { std::sort(Xs.begin(), Xs.end()); vector<long> tmp(3); for(int j = 0; j < K; j++) { for(int k = 0; k < 3; k++) { tmp[k] += Xs[j][k]; } } int t1 = Bs[0].second; int t2 = Bs[1].second; int t3 = Bs[2].second; long ret = tmp[0] / t1; if(ret <= tmp[1] / t2 && ret <= tmp[2] / t3) { return ret; } std::rotate(Bs.begin(), Bs.begin() + 1, Bs.begin() + 3); for(int j = 0; j <= N; j++) { std::rotate(Xs[j].begin(), Xs[j].begin() + 1, Xs[j].begin() + 3); } } return -1; } int main() { int Q; scanf("%d", &Q); while(Q--) { scanf("%ld %d %d %d", &X[0], &N, &K, &B); gen_list(); Bs = factorize(B); int fs = Bs.size(); while(Bs.size() < 3) { Bs.emplace_back(1, 1); } int ret = solve_by_greedy(); if(ret >= 0) { printf("%d\n", ret); } else { int t = 3; int k = 0; if(fs == 3) { printf("%d\n", t / 0); }else if(fs == 2) { printf("%d\n", t / 0); } } } }