[藍橋杯][演算法提高VIP]尤拉函式
題目描述
給定一個大於1,不超過2000000的正整數n,輸出尤拉函式,phi(n)的值。
如果你並不瞭解尤拉函式,那麼請參閱提示。
提示
尤拉函式phi(n)是數論中非常重要的一個函式,其表示1到n-1之間,與n互質的數的個數。顯然的,我們可以通過定義直接計算phi(n)。
當然,phi(n)還有這麼一種計算方法。
首先我們對n進行質因數分解,不妨設n=p1^a1 * p2^a2 * ... * pk^ak (這裡a^b表示a的b次冪,p1到pk為k個互不相同的質數,a1到ak均為正整數),那麼
phi(n)=n(1-(1/p1))(1-(1/p2))....(1-(1/pk))
稍稍化簡一下就是
phi(n)=n(p1-1)(p2-1)...(pk-1)/(p1*p2*...*pk)
計算的時候小心中間計算結果超過int型別上界,可通過調整公式各項的計算順序避免(比如先做除法)!
輸入
在給定的輸入檔案中進行讀入:
一行一個正整數n。
輸出
將輸出資訊輸出到指定的檔案中:
一行一個整數表示phi(n)。
樣例輸入
17
樣例輸出
16
尤拉函式:phi(n)=n(1-(1/p1))(1-(1/p2))....(1-(1/pk)) ;
p代表的是所有質因子(均不同)
例如16:因子有 2 4 6 8 16 其中質因子只有2 所以 phi(16)=n(1-(1/2))=8;
在例如
36:因子有2 3 6 12 36 其中質因子為2,3,phi(36)=n*(1-(1/2))*(1-(1/3))=12
注意事項:
因為可能爆int問題 所以n*(1-(1/p))可以轉化為n/p*(p-1);
對於大的資料儘量使用long
import java.util.Scanner;
public class 尤拉函式 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
long ans = n;
for(int i=2;i*i<=n;i++) {//優化 O(sqrt(n)) 不過要在出口 if(n>1)ans/n*(n-1) O(n)不用
if(n%i==0) {
ans = ans/i*(i-1);////n*(1-(1/p))轉化為n/p*(p-1)
while(n%i==0)
n/=i;
}
}
if(n>1)
System.out.println(ans/n*(n-1));
else
System.out.println(ans);
}
}
相關文章
- [藍橋杯][演算法提高VIP]超級瑪麗演算法
- [藍橋杯][演算法提高VIP]大數加法演算法
- [藍橋杯][演算法提高VIP]奪寶奇兵 dp演算法
- [藍橋杯][演算法提高VIP]分蘋果 線段樹演算法蘋果
- 題目 1501: [藍橋杯][演算法提高VIP]分蘋果演算法蘋果
- [藍橋杯][演算法提高VIP]最大乘積 貪心 雙指標演算法指標
- 藍橋杯演算法提高——字串匹配(Java)演算法字串匹配Java
- 藍橋杯 演算法提高 字串壓縮演算法字串
- [藍橋杯][演算法訓練VIP]方格取數演算法
- [藍橋杯][演算法提高VIP]前10名 Java陣列,list升序,降序,逆序函式Collections.sort和Arrays.sort的使用演算法Java陣列函式
- 藍橋杯 -- 演算法提高 身份證號碼升級演算法
- 藍橋杯 演算法提高 拿糖果(完全揹包dp)演算法
- [藍橋杯][演算法提高VIP]上帝造題五分鐘 (線段樹+區間最小值)演算法
- 演算法訓練 字首表示式 (藍橋杯)演算法
- Java實現 藍橋杯 演算法提高 八數碼(BFS)Java演算法
- 藍橋杯—演算法訓練演算法
- 藍橋杯--演算法訓練演算法
- [藍橋杯][基礎練習VIP]矩形面積交
- 藍橋杯 排序排序
- [Java] 藍橋杯ADV-203 演算法提高 8皇后·改Java演算法
- 藍橋杯 演算法提高 P0102(Java解題)演算法Java
- 藍橋杯_演算法提高_身份證升級(簡單字元處理)演算法字元
- 問題 1462: [藍橋杯][基礎練習VIP]Huffuman樹
- 藍橋杯嵌入式之點燈
- [Java] 藍橋杯ADV-213 演算法提高 3-2求存款Java演算法
- 2016藍橋杯演算法提高——身份證號碼升級演算法
- 藍橋杯-N皇后
- 藍橋杯真題
- 發現一個可以練習藍橋杯VIP題目的網址
- [Java] 藍橋杯ADV-185 演算法提高 五次方數Java演算法
- [Java] 藍橋杯ADV-147 演算法提高 學霸的迷宮Java演算法
- 藍橋杯 (java)演算法訓練 數對Java演算法
- 藍橋杯年號字串字串
- 藍橋杯-帶分數
- 藍橋杯-翻硬幣
- 藍橋杯-螞蟻感冒
- 藍橋杯 計算方程
- 藍橋杯-座次問題