結果
| 問題 |
No.28 末尾最適化
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2020-01-09 18:11:59 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 119 ms / 5,000 ms |
| コード長 | 1,030 bytes |
| コンパイル時間 | 1,706 ms |
| コンパイル使用メモリ | 175,160 KB |
| 実行使用メモリ | 5,248 KB |
| 最終ジャッジ日時 | 2024-11-23 04:00:04 |
| 合計ジャッジ時間 | 2,216 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 2 |
ソースコード
#include <bits/stdc++.h>
#define rep(i,n) for(int i=0;i<(n);i++)
using namespace std;
const int INF=1<<29;
map<long long,int> prime_factorize(long long a){
map<long long,int> res;
if(a%2==0){
int cnt=0;
do{ cnt++; a/=2; }while(a%2==0);
res.emplace(2,cnt);
}
for(long long p=3;p*p<=a;p+=2) if(a%p==0) {
int cnt=0;
do{ cnt++; a/=p; }while(a%p==0);
res.emplace(p,cnt);
}
if(a>1) res.emplace(a,1);
return res;
}
void solve(){
int seed,n,k,base; scanf("%d%d%d%d",&seed,&n,&k,&base);
int a[10001];
a[0]=seed;
rep(i,n) a[i+1]=1+(1LL*a[i]*a[i]+a[i]*12345LL)%100000009;
int ans=INF;
for(auto q:prime_factorize(base)){
int p=q.first;
int hist[30]={};
rep(i,n+1){
int cnt=0;
while(a[i]%p==0) a[i]/=p, cnt++;
hist[cnt]++;
}
int sum=0,rest=k;
rep(x,30){
if(rest>hist[x]){
sum+=hist[x]*x;
rest-=hist[x];
}
else{
sum+=rest*x;
break;
}
}
ans=min(ans,sum/q.second);
}
printf("%d\n",ans);
}
int main(){
int q; scanf("%d",&q); rep(_,q) solve();
return 0;
}