湘潭oj1203/邀请赛A题 数论+java大数

求 n%1+n%2+n%3+n%4+.........n%n=,n<=10^12次。

开始时盲目地找规律,结果一无所获。后来经学长点拨,天资愚钝,搞了半天才明白。

先上图:

对于该题,在求区间(根号n,n),由于n%i=n-i*x(这里x是从1枚举到根号n,每个k 对应n/(x+1)~n/x区间内,由于是等差数列(还是递减),直接用公式求和)。

哎(根号n,n)区间是被分割来求得,分成根号n次。

import java.io.*;
import java.util.Scanner;
import java.math.BigInteger;
public class Main{

	public static void main(String[] args) {
		int T;
	    Scanner in=new Scanner(System.in);
	    T=in.nextInt();
	    for(int ii=1;ii<=T;ii++)
	    {
	          long n;
	          BigInteger sum=new BigInteger("0");
	           n=in.nextLong();
	           long lasta=2*n;
	        for(long i=1;i*i<n;i++)
	        {
	        	 sum=sum.add(BigInteger.valueOf(n%i));
	        	 if((i+1)>=lasta){break;}              //边界判断
	        	  long b=n/i;
	              long a=n/(i+1)+1;
	              BigInteger temp1=BigInteger.valueOf(n);         //将一个 long型数据转为biginteger
	              temp1=temp1.multiply(BigInteger.valueOf((b-a+1)));
	              BigInteger temp2=BigInteger.valueOf(b+a);
	              temp2=temp2.multiply(BigInteger.valueOf(i));    //*
	              temp2=temp2.multiply(BigInteger.valueOf(b-a+1));
	              temp2=temp2.divide(BigInteger.valueOf(2));   //除以
	              temp1=temp1.subtract(temp2);                 // -
	            sum=sum.add(temp1);                             //+
	           lasta=a;
	        }
	         System.out.println("Case "+ii+": "+sum);         //Java的println自动带换行。注意!
	    }

	}

}

湘潭oj1203/邀请赛A题 数论+java大数

时间: 2024-07-29 14:04:04

湘潭oj1203/邀请赛A题 数论+java大数的相关文章

湘潭oj1203/邀请赛A称号 数论+java睑板

乞讨 n%1+n%2+n%3+n%4+.........n%n=,n<=10^12次要. 一味的找规律之初.没有发现.后来,前辈执教后,人才平淡,所以,现在唯一明确的. 首先在地图上: 对于该题,在求区间(根号n,n),因为n%i=n-i*x(这里x是从1枚举到根号n,每一个k 相应n/(x+1)~n/x区间内.因为是等差数列(还是递减).直接用公式求和). 哎(根号n,n)区间是被切割来求得.分成根号n次. import java.io.*; import java.util.Scanner;

2014湘潭全国邀请赛I题 Intervals /POJ 3680 / 在限制次数下取有权区间使权最大/小问题(费用流)

先说POJ3680:给n个有权(权<10w)开区间(n<200),(区间最多数到10w)保证数轴上所有数最多被覆盖k次的情况下要求总权最大,输出最大权. 思路:       限制的处理:s-->开始流量为k,要求总权最大,即费用最大,所以费用取负,最小费用最大流即可.对于输入区间[a,b]:w,添加边:a-->b,流量为1,费用为-w. 对于点i,i+1,添加边,费用为0,流量无穷.显然这种处理,限制了区间最多取k次,(流量控制),跑最大流能走添加的边尽量走,且越大越好(负数刚刚是

ACM学习历程—HDU 3092 Least common multiple(数论 &amp;&amp; 动态规划 &amp;&amp; 大数)

hihoCoder挑战赛12 Description Partychen like to do mathematical problems. One day, when he was doing on a least common multiple(LCM) problem, he suddenly thought of a very interesting question: if given a number of S, and we divided S into some numbers

hdu4927 Series 1(组合+公式 Java大数高精度运算)

题目链接: Series 1 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 423    Accepted Submission(s): 146 Problem Description Let A be an integral series {A1, A2, . . . , An}. The zero-order series o

多校第六场 HDU 4927 JAVA大数类

题目大意:给定一个长度为n的序列a,每次生成一个新的序列,长度为n-1,新序列b中bi=ai+1?ai,直到序列长度为1.输出最后的数. 思路:这题实在是太晕了,比赛的时候搞了四个小时,从T到WA,唉--对算组合还是不太了解啊,现在对组合算比较什么了-- import java.io.*; import java.math.*; import java.util.*; public class Main { public static void main(String[] args) { Sca

ZOJ 1442 Dinner Is Ready 容斥原理 + java大数

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=442 求解 x1 + x2 + x3 + .... + xn = m 其中xi属于[L, R] 不同解的个数. 这题需要用大数,要注意. 原理和以前做的一样.容斥.先算出每个xi大于等于Li的解的个数.关于这个,怎么解,看看: http://www.cnblogs.com/liuweimingcprogram/p/6091396.html 然后容斥吧,枚举有一个数破坏条件,就是

ACM-ICPC java(大数)使用总结

今天碰到一道大数除法和模运算的题,以前也写过加减乘的大数模拟运算,但总觉着太麻烦了,今天大体了解了一下Java的输入输出,特来总结一下如何使用java中的高精度类型.首先我们要会建一个简单的java程序(以A+B为例)如下 import java.io.*; import java.util.*; import java.math.*; import java.text.*; public class Main { public static void main(String args[]) {

BNUOJ 34985 Elegant String 2014北京邀请赛E题 动态规划 矩阵快速幂

Elegant String Time Limit: 1000msMemory Limit: 65536KB 64-bit integer IO format: %lld      Java class name: Main We define a kind of strings as elegant string: among all the substrings of an elegant string, none of them is a permutation of "0, 1,-, k

hdu1715(Java)大数相加

大菲波数 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 17352 Accepted Submission(s): 5778 Problem Description Fibonacci数列,定义如下:f(1)=f(2)=1f(n)=f(n-1)+f(n-2) n>=3.计算第n项Fibonacci数值. Input 输入第一行为一个整数N,接