bzoj 3858: Number Transformation
考虑一下变形,得到每一次变化等于\(ans=\left\lfloor\dfrac{ans}{i}+1\right\rfloor\times i\)
变形,得\(ans=\left\lfloor\dfrac{ans}{i}\right\rfloor\times i+i\)
因为 \(ans\%(i-1)=0\)
所以\(ans=\left\lfloor\dfrac{(i-1)k}{i}\right\rfloor\times i+i\)
\(k\)增长地一定比\(i\)慢,当 \(i\),\(k\) 足够大时,\(\left\lfloor\dfrac{(i-1)k}{i}\right\rfloor\)可近似等于某个值。
代码实现:
#include<cstdio>
#include<cmath>
using namespace std;
long long ans,tot,m,n;
int main() {
// freopen("1.in","r",stdin);
register long long i=0,j=0;
scanf("%lld%lld",&n,&m);
while(m&&n) {
j++;
ans=n;
tot=n;
for(i=1; i<=m; i++) {
ans=ceil(ans*1.0/i)*i;
if(ans/i==tot&&i*i>m) break;
tot=ans/i;
}
//putchar('\n');
printf("Case #%lld: %lld\n",j,tot*m);
scanf("%lld%lld",&n,&m);
}
}