bzoj 3858: Number Transformation

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3858
题解:这是一道奇怪的打表规律题,大神们可以直接感受其实类似于分块然而我不行,我们会发现,不断进行计算的时候,假设计算到 i ,当前为n,当满足 i>=n 此后 ni 不变,
于是我们可以模拟然后当满足条件时可以开心的输出 nik
然而作为一个正常人,我们一定要知道为什么算法的正确性和复杂度为何科学 。
正确性:1.当第一次满足 i>=n 后一定一直满足此性质
考虑, n 的增量dn 至多 为 i , 而 i 每次增加 1 ,明显此时n的增量至少为 2i+1 才行,所以 n 增长缓慢,此后一直满足此性质
2.设 S=n, i>=S ,设 ni=T<=S
可知要计算 (niii+1)=(Ti(i+1))=
(T(1+1i)) 我们要使一个数 f 除一个数g,至少减一,那么满足 fg<=f1 ,即 g>=1+1f1>=1+1f ,然而,可知 i>=S>=T ,所以T不变。
复杂度:考虑一个计数器,假设进行了 j 次,n最好情况下每次增量为相应的 j ,则解方程j2>=n+j(j+1)2,可约得 j>=n 总复杂度: O(nn

代码:

#include<cstdio>  
#include<cstring>  
#include<iostream>  
#include<algorithm>  
using namespace std;    
long long n,k,cnt;
int main()  
{  
    long long i;  
    while(scanf("%lld%lld",&n,&k),n||k)  
    {  
        for(i = 2;i <= k; i++)  
        {  
            long long temp = ( n + i - 1) / i;  
            if (temp <= i)  
            {  
                n = temp * k;  
                break;  
            }  
            n = temp * i;  
        }  
        printf("Case #%lld: %lld\n",++cnt,n);  
    }  
    return 0;  
}  

总结:当遇到做不出来的数学性很强的题目可以打表找规律或大胆猜测验证。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值