1. 程式人生 > 其它 >數學_尤拉函式

數學_尤拉函式

技術標籤:數論

題意:

1262 扔球

在圓上一點S,扔出一個球,這個球經過N次反彈還有可能回到S點。N = 4時,有4種扔法,如圖:
在這裡插入圖片描述

恰好經過4次反彈回到起點S(從S到T1,以及反向,共4種)。

給出一個數N,求有多少種不同的扔法,使得球恰好經過N次反彈,回到原點,並且在第N次反彈之前,球從未經過S點。

輸入
輸入一個數N(1 <= N <= 10^9)。

輸出
輸出方案數量。
資料範圍
12% 2 <= N <= 30
20% 2 <= N <= 1000
40% 2 <= N <= 300000
100% 2 <= N <= 1000000000

輸入樣例
4

輸出樣例

4

思路:

啊啊啊啊啊!!記結論吧!!
gcd(x, n + 1) == 1即比n + 1小且與n + 1互質的數(多畫幾個圖)

程式碼實現:

尤拉函式求解:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<stack>
#include<queue>
#include<string>
#include<cmath>
#include<map>
#include<set>
#include<vector> #include<cstdlib> using namespace std; typedef long long ll; const int maxn = 2e5 + 5; int eular(int n){ int ans = n; for(int i = 2;i * i <= n;i++){ if(n % i == 0){ ans = ans / i * (i - 1); while(n % i == 0) n = n / i; } } if(n > 1) ans = ans / n * (n - 1
); return ans; } int main(){ int n; scanf("%d",&n); n++; int res = eular(n); printf("%d\n",res); return 0; }