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~n與x互質的數的個數(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的值大於X時n的值
題目描述 求恰好使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-n的n個人首尾相接,1到3報數,報到3的退出,求最後一個人的標號
stat 留下 pub ++ [] amp n) person last 標號1-n的n個人首尾相接,1到3報數,報到3的退出,求最後一個人的標號 public static void lastPerson(int n){ if (n < 1){
從鍵盤中輸入一個整數n,求1-n的和,以及偶數和、奇數和
n=int(input("從鍵盤中輸入一個數:")) sum1=0 sum2=0 sum3=0 i=1 while i<=n: sum1+=i if i%2==0: sum2+=i else: