您的位置:首页 > 其它

找规律(约瑟夫的数论问题,uva 1363)

2016-10-20 15:22 288 查看
感觉你现在的知识储备还可以了,问题在于如何做题。

很多时候题目都不是模板题,不是说你一定要知道某个经典算法才能做的。大部分时候都是依靠着基础的算法,自己创造出一个解决办法。这就需要对基础知识掌握得十分牢固以及大量的做题思考后才能达到。希望自己以后做题要多乱搞,或者说多分析思考,而不是总想着套什么算法。

找规律就是一种乱搞,能优化时间复杂度。至于怎么想到答案,我只能说,就认真想就好了。认真想你就会分析,然后能找到一些突破口进而解决问题。突破口其实就那么点,线索也就那么点,所以大部分人思考后的解法都是差不多的。

与其说是找规律,不如说是乱搞,或者说想尽办法去解决问题。

一个一个加会超时,那就尝试找到一段一段的规律,然后一整段加起来。

一开始WA还以为是要高精度呢,事实上只是自己在编程时有一些细节漏掉了。

在一些结束的边界情况有所遗漏。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

ll n,k;

int main()
{
while(scanf("%lld %lld",&n,&k)!=EOF)
{
ll i=1;
ll ans=0;
while(1)
{
ll p=k/i;
if(p==0)
{
ans+=(n-i+1)*k;
break;
}
ll j=k/p;
j=min(j,n);
ll shou=k%i;
ll mo=shou-(j-i)*p;
ans+=(shou+mo)*(j-i+1)/2;
i=j+1;
if(i>n) break;
}
printf("%lld\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: