結果
問題 | No.28 末尾最適化 |
ユーザー | r_dream0 |
提出日時 | 2017-02-03 01:59:52 |
言語 | C++11 (gcc 11.4.0) |
結果 |
AC
|
実行時間 | 1,376 ms / 5,000 ms |
コード長 | 2,057 bytes |
コンパイル時間 | 784 ms |
コンパイル使用メモリ | 78,892 KB |
実行使用メモリ | 5,376 KB |
最終ジャッジ日時 | 2024-06-06 12:23:36 |
合計ジャッジ時間 | 2,543 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
5,248 KB |
testcase_01 | AC | 1,376 ms
5,376 KB |
コンパイルメッセージ
main.cpp: In function ‘int main()’: main.cpp:69:8: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 69 | scanf("%d", &Q); | ~~~~~^~~~~~~~~~ main.cpp:71:10: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 71 | 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]++; } } } } long answer = -1; 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; //cout << tmp[0] << "," << tmp[1] << "," << tmp[2] << endl; //cout << Bs[0].first << "," << Bs[1].first << "," << Bs[3].first << endl; //cout << endl; if(ret <= tmp[1] / t2 && ret <= tmp[2] / t3) { if(answer == -1 || answer > ret) answer = 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 answer; } 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; for(;;); } } }