UVA-1363 約瑟夫的數論問題

題意:

輸入正整數n和k(1<=n,k<=10^{9}),計算\sum_{i=1}^{n}k\, mod\, i

分析:

根據紫書,假設k/i的整數部分等於p,則k mod i=k-i*p。於是從i,i+1,i+2,······,j,k除以它們的商的整數部分都相同,則k除以它們的餘數會是一個等差數列。

這樣,可以在枚舉i時把它所在的等差數列之和累加到答案中。這需要計算滿足[k/j]和[k/i]=p的最大j。

當p=0時這樣的j不存在,所以等差數列一直延續到序列的最後。

當p>0時j爲滿足k/j>=p的最大j,即j<=k/p。

注意:當i>k時k mod i = k。即i>k的部分之和爲k*(n-k)。

代碼:

#include<iostream>
using namespace std;
typedef long long ll; 
ll ans,n,k;
void f(){
	ll i=2,p,t,d,nn;
	ans=0;
	while(i<k){
		if(i>n)
			break;
		p=k/i;
		t=k%i;
		d=k/p;
		//printf("i:%d p:%d t:%d d:%d ",i,p,t,d);
		nn=min(d,n)-i+1;
		ans+=nn*t+((k%(i+1)-t)*(nn-1)*nn)/2;
		//printf("%d\n",(d-i+1)*t+(k%(i+1)-t)*(d-i));
		i=min(d,n)+1;
	}
	if(n>k){
		ans+=k*(n-k);
	}
}
int main(){
	while(cin>>n>>k){
		f();
		cout<<ans<<endl;
	}
	return 0;
} 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章