您的位置:首页 > 其它

poj 2800 Joseph’s Problem(数论)

2017-06-04 21:02 405 查看
题目大意:给定n和k,求 ∑1<=i<=n(k
mod i)

题目分析:n和k很大,直接算会TLE,但是可以先打表找规律。

要以 sqrt(k) 为分界

1) I从1~sqrt(k) 直接求用一重循环;

2)i从 sqrt(k)~k 因为商相同的时候 他们的余数会成等差数列,所以只要枚举商从 sqrt(k)到1就行了;

3)i从k~n就是(n-k)*k;

自己推一下,反正就是前面商的差距很大,后面商的差距很集中,利用了这个;

代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#define LL long long
using namespace std;
LL n,k;
LL solve(LL n,LL k){
LL ans=0,a=(LL)sqrt((double)k),b=k/a,s,t,i;
if(n>k)
ans+=(n-k)*k;
for(i=a;i>1;i--){
s=k/i;
t=k/(i-1);
if(s>n) break;
if(t>n) t=n;
ans+=(t-s)*(k%t+k%(s+1))/2;
}
if(n<b) b=n;
for(i=1;i<=b;i++)
ans+=k%i;
return ans;
}
int main(){
while(~scanf("%lld%lld",&n,&k)){
printf("%lld\n",solve(n,k));
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: