传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3858
题解:这是一道奇怪的打表规律题,大神们可以直接感受其实类似于分块然而我不行,我们会发现,不断进行计算的时候,假设计算到
i
,当前为
于是我们可以模拟然后当满足条件时可以开心的输出
⌈ni⌉∗k
然而作为一个正常人,我们一定要知道为什么算法的正确性和复杂度为何科学 。
正确性:1.当第一次满足
i>=n−√
后一定一直满足此性质
考虑,
n
的增量
2.设
可知要计算
⌈(⌈ni⌉∗ii+1)⌉=⌈(T∗i(i+1))=
⌈(T(1+1i))⌉
我们要使一个数
f
除一个数
复杂度:考虑一个计数器,假设进行了
j
次,
代码:
#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;
}
总结:当遇到做不出来的数学性很强的题目可以打表找规律或大胆猜测验证。