您的位置:首页 > 编程语言 > Java开发

XTU 1203 A simple problem

2016-03-03 09:54 489 查看
http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id/1203

首先倒着看,这题目肯定是根号n的复杂度,那么后根号n的数量比较分散,发现等差数列后即可求和去算, 前根号n的数正常算就ok!

然后发现需要高精度,那么就上java!注意讨论不同情况时候的终止条件就ok 了!

//package hh;
import java.io.*;
import java.util.*;
import java.lang.*;
import java.math.*;
import static java.math.BigInteger.*;
public class Main
{
static Scanner cin;
public static void solve(int cc)
{
long n=cin.nextLong(),i;
BigInteger ans = ZERO;
for (i = 1;;++i) {
long from = n / (i + 1) + 1;
long to = n / i;
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 就是等差数列的和
if(i>=from) {
System.out.println("Case "+cc+": "+ans);
break;
}
ans = ans.add(valueOf(n % i));
if (from == i + 1) {
System.out.println("Case "+cc+": "+ans);
break;
}
}
}
public static void main(String[] args )
{
cin=new Scanner(System.in);
int t=cin.nextInt(),cc=0;
while (t-->0)
{
new Main().solve(++cc);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java xtu