Problem Description
There is a simple problem. Given a number N. you are going to calculate N%1+N%2+N%3+...+N%N.
Input
First line contains an integer T, there are T(1≤T≤50) cases. For each case T. The length N(1≤N≤1012).
Output
Output case number first, then the answer.
Sample Input
1
5
Sample Output
Case 1: 4
//题解:
因为 N%N=0,N%(N-1)=1,N%(N-2)=2,(当N较大时)可以发现,N 对 floor(N/2)+1到N的模除的结果依次减少1,模除的结果形成了等差数列。这是我们可以求的。
同理可以求得(N/3, N/2)区间,(N/4, N/3)区间的模除和。
//标程:
import java.io.*;
import java.util.*;
import java.lang.*;
import java.math.*;
import static java.math.BigInteger.*;
public class Main
{
static Scanner cin;
void doit(int cc)
{
long n=cin.nextLong(),i;
BigInteger ans = ZERO;
for (i = 1;;++i) {
long from = n / (i + 1) + 1;
long to = n / i;
if (from <= i + 1) {
from = i + 1;
}
if (from <= to) {
long num = to - from + 1; //项数
long sum = n % from + n % to; //首项 + 末项的和
if (sum%2==1) {
num /= 2;
}
else {
sum /= 2;
}
ans = ans.add(valueOf(sum ).multiply(valueOf(num ))) ; // sum * num 就是等差数列的和
}
ans = ans.add(valueOf(n % i));
if (from == i + 1) {
System.out.println("Case "+cc+": "+ans);
break;
}
}
}
public static void main(String[] args ) throws Exception
{
cin=new Scanner(System.in);
int t=cin.nextInt(),cc=0;
while (t-->0)
{
new Main().doit(++cc);
}
}
}
A simple problem
最新推荐文章于 2021-08-09 18:54:27 发布