結果
| 問題 | 
                            No.28 末尾最適化
                             | 
                    
| コンテスト | |
| ユーザー | 
                             古寺いろは
                         | 
                    
| 提出日時 | 2015-04-15 21:39:11 | 
| 言語 | C++11(廃止可能性あり)  (gcc 13.3.0)  | 
                    
| 結果 | 
                             
                                AC
                                 
                             
                            
                         | 
                    
| 実行時間 | 321 ms / 5,000 ms | 
| コード長 | 948 bytes | 
| コンパイル時間 | 1,473 ms | 
| コンパイル使用メモリ | 165,448 KB | 
| 実行使用メモリ | 5,376 KB | 
| 最終ジャッジ日時 | 2024-07-04 14:36:17 | 
| 合計ジャッジ時間 | 2,161 ms | 
| 
                            ジャッジサーバーID (参考情報)  | 
                        judge5 / judge2 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| other | AC * 2 | 
ソースコード
#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;
	}
}
            
            
            
        
            
古寺いろは