UVA 1363 - Joseph's Problem(整除分块)

题目链接 https://cn.vjudge.net/problem/UVA-1363

【题意】
输入正整数 n , k ( 1 <= n , k <= 10 9 ) 计算

i = 1 n k   m o d   i

【思路】
n > k 时,余数始终为 k
n <= k 时,设

p = k i , k   m o d   i = k p i
如果有
k i + 1 = p , k   m o d   ( i + 1 ) = k p ( i + 1 ) = k p i p = k   m o d   i p
说明只要 k 除以 i 的整数部分相同,那么 k   m o d   i 就会形成一个等差数列,用一次求和公式即可

#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;
}

猜你喜欢

转载自blog.csdn.net/xiao_k666/article/details/82153181