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;
}
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;
}
相关文章推荐
- POJ 2800 Joseph's Problem(数论)
- POJ 2800 Joseph’s Problem 数论找规律
- POJ 2800 Joseph's Problem
- UVa 1363 POJ 2800 Joseph's Problem
- (one day one problem)poj 2800 Joseph's Problem (数学)
- POJ 2800 Joseph's Problem 笔记
- Poj 2800 Joseph's Problem - 找规律
- POJ 2800 : Joseph\'s Problem (须仔细分析)
- POJ 2480 Longge's problem(数论)
- Joseph's Problem 数论 找规律
- POJ2480——Longge's problem(数论,欧拉函数d)
- UVA 1363 - Joseph's Problem(数论)
- UVA 1363 Joseph's Problem(数论)
- UVa1363 - Joseph's Problem(数论)
- uva 1363 - Joseph's Problem(数论)
- POJ 3696 神TM数论
- poj 1681 Painter's Problem(高斯消元)
- 数论中的基本算法 POJ 1845 SPOJ DIVSUM
- 数论poj1845(A^B的约数和)
- 数论·素筛·POJ 3292·Semi-prime H-numbers