結果

問題 No.28 末尾最適化
ユーザー 古寺いろは古寺いろは
提出日時 2015-04-15 21:39:11
言語 C++11
(gcc 11.4.0)
結果
AC  
実行時間 374 ms / 5,000 ms
コード長 948 bytes
コンパイル時間 1,264 ms
コンパイル使用メモリ 151,384 KB
実行使用メモリ 4,380 KB
最終ジャッジ日時 2023-09-17 20:26:35
合計ジャッジ時間 2,053 ms
ジャッジサーバーID
(参考情報)
judge13 / judge12
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
4,376 KB
testcase_01 AC 374 ms
4,380 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include "bits/stdc++.h"
using namespace std;

bool isprime(int a){
	for (int i = 2; i * i <= a; i++)
	{
		if (a%i == 0) return false;
	}
	return true;
}

int main() {
	int Q;
	cin >> Q;
	for (int t = 0; t < Q; t++)
	{
		int seed, N, K, B;
		cin >> seed >> N >> K >> B;
		N++;
		vector<long long> X(N);
		X[0] = seed;
		for (int i = 1; i < N; i++)
		{
			X[i] = 1 + (X[i - 1] * X[i - 1] + X[i - 1] * 12345) % 100000009;
		}
		int ans = 99999999;
		for (int p = 2; p <= B; p++)
		{
			if (!isprime(p)) continue;
			if (B % p != 0) continue;
			int div = 0;
			int tempB = B;
			while (B % p == 0){
				B /= p;
				div++;
			}
			vector<int> ar(N);
			for (int i = 0; i < N; i++)
			{
				long long temp = X[i];
				while (temp % p == 0){
					ar[i]++;
					temp /= p;
				}
			}
			sort(ar.begin(), ar.end());

			int mul = 0;
			for (int i = 0; i < K; i++)
			{
				mul += ar[i];
			}
			ans = min(ans, mul / div);
		}
		cout << ans << endl;
	}
}

0