1. 程式人生 > >SPOJ Equation :求 1/n!=1/x+1/y 的解的個數

SPOJ Equation :求 1/n!=1/x+1/y 的解的個數

解析:

題目就是求1/n! = 1/x + 1/y 的解的個數,看樣例知要考慮(x,y)對數的關係。
設 m=n! ,由等式知x,y必定大於n!,所以再設 x=n!+k=m+k 帶入 1/m=1/x+1/y 中化簡得到y=m*m/k+m,因y為整數,所以要求k整除m*m,即k為m*m的因子,問題便轉化為求n!*n!的因子個數, 設n!=p1^e1 * p2^e2 * p3^e3 *...*pk^ek,則 n!*n!= p1^(2*e1) * p2^(2*e2) *...*pk^(2*ek) 。 則因子個數sum=(2*e1+1)*(2*e2+1)*...*(2*ek+1); 答案很大,需要高精度。用java處理方便!
import java.util.*;
import java.math.*;

public class Main {
	static int N = 10050;
	static int q = 0;
	
	static int prime[] = new int[N];

	public static void sieve_prime( ){
		int i;
		int  flag[] = new int [N];
		for (i = 2; i * i < N; i++) {
			if (flag[i] == 0)
				prime[q++] = i;
			for (int j = i * i; j < N; j += i) {
				flag[j] = 1;
			}
		}
		for (; i < N; i++)
			if (flag[i] == 0)
				prime[q++] = i;
	}

	public static void solve(int n) {
		BigInteger ans = BigInteger.valueOf(1);		
		int temp,count;
		for (int i = 0; prime[i]<= n && i < q && n > 1; i++) {
				count = 0;
				temp= prime[i];
				while (temp <=	n) {
				    count+=n/temp;
					temp*=prime[i];
				}
				ans = ans.multiply(BigInteger.valueOf(count * 2 + 1));
		}
		System.out.println(ans);
	}
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		sieve_prime();
		int x;
		while (in.hasNext()) {
			x = in.nextInt();
			if (x == 0)   break;
			solve(x);
		}
		in.close();
	}	 
}



相關推薦

SPOJ Equation : 1/n!=1/x+1/y個數

解析: 題目就是求1/n! = 1/x + 1/y 的解的個數,看樣例知要考慮(x,y)對數的關係。 設 m=n! ,由等式知x,y必定大於n!,所以再設 x=n!+k=m+k 帶入 1/m=1/

1~nx互質的數的個數(6個題、容斥原理)

HDU 4135、POJ 2773、HDU 1695、HDU 2841、ZOJ 2836、HDU 1796 HDU 4135 Co-prime 題意: 求[l,r]與x互質的數的

T29:1~n整數中1出現的次數

求出1~13的整數中1出現的次數,並算出100~1300的整數中1出現的次數?為此他特別數了一下1~13中包含1的數字有1、10、11、12、13因此共出現6次,但是對於後面問題他就沒轍了。ACMer希望你們幫幫他,並把問題更加普遍化,可以很快的求出任意非負整數區間中1出現的次數(從1 到 n 中1

【劍指offer】43、1~n整數中1出現的次數

ase 表示 eight pre pub 題目 我們 return 1出現的次數 題目 輸入一個整數,求1~n的整數十進制表示中1出現的次數。如12,有1,10,11,12,總共出現了5次。 思路 註意不是統計出現1的數字的多少,而是統計1出現了幾次。 我們按位來分析 個位

【 51NOD 1434 素數篩 】【數論+思維+篩素數】區間LCM【找到一個最小整數M,滿足M>N,LCM(N+1,N+2,..,M-1,M)是LCM(1,2,3,4,.,N-1,N) 的倍數】

思路: 雖然是四級題,但是思路還是不太清晰,找網上題解講的很多不是特別清晰(可以隨便舉些例子理解一下) 首先可以得出一個性質:LCM(1,2,3,4,...,N-1,N) 中質因子k的出現的次數為t

給一個正整數n,計算從1-n中出現1的次數

con 個數字 優化 個數 數字 higher 通過 需要 出現的次數 如12出現1的次數為5,分別是:1,10,11,12 一般做法:從1-n遍歷,計算每一個數中每一位出現1的次數 function count(num){ var n=0;

尤拉函式(n互質的數的個數

求解與n(1-n-1)互質的質因子的個數 解析:(轉) 定義:對於正整數n,φ(n)是小於或等於n的正整數中,與n互質的數的數目。     例如:φ(8)=4,因為1,3,5,7均和8互質。 性質:1.若p是質數,φ(p)= p-1. 2.若n是質數p的k

ACMNO.16用迭代法平方根的迭代公式為: X[n+1]=1/2(X[n]+a/X[n]) 要求前後兩次出的得差的絕對值少於0.00001。 輸出保留3位小數 輸入 X 輸出 X

題目描述 用迭代法求 。 求平方根的迭代公式為: X[n+1]=1/2(X[n]+a/X[n]) 要求前後兩次求出的得差的絕對值少於0.00001。 輸出保留3位小數 輸入 X 輸出 X的平方根 樣例輸入 4 樣例輸出 2.000 來

jzxx1039恰好使s=1+1/2+1/3+…+1/n的值大於Xn的值

題目描述 求恰好使s=1+1/2+1/3+…+1/n的值大於X時n的值。(2<=x<=10) 輸入 輸入只有一行,包括1個整數X。 輸出 輸出只有一行(這意味著末尾有一個回車符號),包括1個整數。 樣例輸入 2 樣例輸出 4 滿分程式碼: #incl

區間x∈[1,n],y∈[1,m],gcd(x,y)=1的數量 [容斥]

Problem Description There are many trees forming a m * n grid, the grid starts from (1,1). Farmer Sherlock is standing at (0,0) po

用for和while循環e的值[e=1+1/1!+1/2!+1/3!+1/4!+1/5!+...+1/n!]

主函數 int class urn log emp art print tracking /*編敲代碼,依據下面公式求e的值。要求用兩種方法計算: 1)for循環。計算前50項 2)while循環,直至最後一項的值小於10-4 e=1+1/1!+1/2!+1/

O(n)1~n的逆元

n) mod 一個 -m 是個 .html 地址 得到 href 原地址:http://www.2cto.com/kf/201401/272375.html 前提是MOD是個素數。 新學的一個求逆元的方法: inv[i] = ( MOD - MOD /

LightOJ - 1117 Helping Cicada (1~n有多少個數不能被這m個數中任意一個整除)(容斥+狀態壓縮)

vol == show fine cst href main http color 題意:http://www.lightoj.com/volume_showproblem.php?problem=1117 考慮1個數k,1~n有[n/k]個數能被k整除,[a]表示a向下取

偶數1/2+1/4+...+1/n奇數1/1+1/3+...+1/n

exti blank blog pan targe ava href spa tin 題目:編寫一個函數,輸入n為偶數時,調用函數求1/2+1/4+...+1/n,當輸入n為奇數時,調用函數1/1+1/3+...+1/n Scanner scanner

模板(線性時間1~n的所有歐拉函數值)

namespace 別人 mat 假設 name www tle http scan 定理: (以下p均為質數) 1. φ(p)=p-1 3. 如果 i mod p ≠ 0 那麽 φ(i*p)=φ(i)*φ(p) 2. 如果

C語言:完美數,1-n之間的

輸入n,求1-n之間的完美數 完全數(Perfect number),又稱完美數或完備數,是一些特殊的自然數。如果一個數恰好等於它所有的因子之和,則稱該數為“完全數”。具體完美數定義請見完美數-百度百科 #include "stdio.h" void main() { int

BZOJ3994:約數個數和(莫比烏斯反演:[1,N]*[1,M]的矩陣的因子個數

Description  設d(x)為x的約數個數,給定N、M,求   Input 輸入檔案包含多組測試資料。 第一行,一個整數T,表示測試資料的組數。 接下來的T行,每行兩個整數N、M。 Ou

1-N中的所有素數 ,不連N算。

import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while (scanner.hasNex

標號1-nn個人首尾相接,1到3報數,報到3的退出,最後一個人的標號

stat 留下 pub ++ [] amp n) person last 標號1-n的n個人首尾相接,1到3報數,報到3的退出,求最後一個人的標號 public static void lastPerson(int n){ if (n < 1){

從鍵盤中輸入一個整數n1-n的和,以及偶數和、奇數和

n=int(input("從鍵盤中輸入一個數:")) sum1=0 sum2=0 sum3=0 i=1 while i<=n: sum1+=i if i%2==0: sum2+=i else: