UVA 1363 - Joseph's Problem(整除分块)
题目链接 https://cn.vjudge.net/problem/UVA-1363
【题意】
输入正整数 计算
【思路】
当时,余数始终为
当时,设
如果有
说明只要 除以 的整数部分相同,那么 就会形成一个等差数列,用一次求和公式即可
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,k;
int main(){
while(scanf("%lld%lld",&n,&k)==2){
ll ans=0;
if(n>k){
for(ll L=1,R;L<=k;L=R+1){
R=k/(k/L);
ans+=(k%L+k%R)*(R-L+1)/2LL;
}
ans+=(n-k)*k;
}
else{
for(ll L=1,R;L<=n;L=R+1){
R=k/(k/L);
if(R<=n) ans+=(k%L+k%R)*(R-L+1)/2LL;
else ans+=(k%L+k%n)*(n-L+1)/2LL;
}
}
printf("%lld\n",ans);
}
return 0;
}