把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end

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);
    }
}
posted @ 2020-03-29 18:39  275307894a  阅读(38)  评论(0编辑  收藏  举报
浏览器标题切换
浏览器标题切换end