No.28 末尾最適化 - yukicoder
- 問題をみた瞬間なんじゃこりゃーってなった問題。
- 解答をみると難しくはないとわかるけど。
class TailCallOptim {
public:
void solve(void) {
int Q;
cin>>Q;
REP(_,Q)
{
int seed, n,K,B;
cin>>seed>>n>>K>>B;
vector<ll> x(n+1);
x[0] = seed;
FOR(i,1,n+1)
x[i] = 1+(x[i-1]*x[i-1] + x[i-1]*12345 + 100000009) % 100000009;
int ans = (1<<30);
auto primes = primeFactorize(B);
for (auto pk : primes)
{
int p,k;
tie(p,k) = pk;
vector<int> ks(n+1,0);
REP(i,n+1)
{
int l = 0;
ll tmp = x[i];
while (tmp % p == 0)
{
++l;
tmp /= p;
}
ks[i] = l;
}
sort(RANGE(ks));
int L = 0;
REP(i,K)
L += ks[i];
ans = min(ans, L/k);
}
cout<<ans<<endl;
}
}
};