首页 > 其他 > 详细

Problem J. Joseph’s Problem 约瑟夫问题--余数之和

时间:2019-07-26 21:53:38      阅读:82      评论:0      收藏:0      [点我收藏+]

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

 

题意:给出n  k,当 i 属于 1~n 时 ,求解 n% i 的和

n 和 k 的范围都是 1 到 10^9;

 

商相同 的余数数列 是 公差为商 的 递减等差数列

 

应该让k / i相等的一连串k % i相加,举个例子:

 

100 / 34 = 2 ... 32

 

100 / 35 = 2 ... 30

 

100 / 36 = 2 ... 28

 

...

 

100 / 50 = 2 ... 0

 

递减等差数列通项公式:an=a1-(n-1)*d

 

前n项和公式:sum=n*a1-n*(n-1)*d/2;

 

#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
ll n,k,d,a,len,sum;
int main()
{
     freopen("joseph.in","r",stdin);
     freopen("joseph.out","w",stdout);
    while(cin>>n>>k)
    {
        sum=0;
        for(ll i=2;i<=n;i=i+len)
        {
            d=k/i;//公差
            a=k%i;//递减等差数列的首项,最长递减到零结束
            if(i>k)
            {
                sum=sum+k*(n-k);
                break;
            }
            len=a/d+1;//由递减等差数列的的通项公式an=a1+(n-1)*d解得数列递减到0的长度
            len=min(len,n-i+1);//最后一段等差数列可能没有递减到零,长度要另外判断
            sum=sum+len*a-len*(len-1)*d/2;//等差数列前n项和公式
        }
        cout<<sum<<endl;
    }
    return 0;
}

 

Problem J. Joseph’s Problem 约瑟夫问题--余数之和

原文:https://www.cnblogs.com/-citywall123/p/11252957.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!