BJOI 尤拉函式 Euler

2021-07-24 12:27:03 字數 1169 閱讀 7614

給你乙個數y要求輸出乙個滿足φ(x)=y的最小的x,有t組詢問。

y<=1012

1<=t<=2

求φ(x)時有乙個眾所周知的公式是φ(x)=x∗πpi−1pi(pi為x的所有質因子),也就是說這我們可以得到等式

φ(x)=y

x∗πpi−1pi=y (等式一)

x=y∗πpipi−1 (等式二)

由等式一可知,因為pi都是x的質因子,所以我們可以把下面的pi都與x約掉,然後我們就發現x的質因子要不就是y的質因子,要不就是y的約數加一。而由等式二可知我們只需要找出πpipi−1最小的符合要求的解就行了。不難發現符合要求的x可能的質因子只有1000多個,那麼我們只需暴力判斷每個質數選不選再加個全域性最優解的優化就可以了。

#include 

#include

#include

using

namespace

std;

const

int maxn = 7e3;

typedef

long

long ll;

ll n, ans, fac[maxn], pri[maxn];

int tot, cnt;

void prepare(ll n)

}bool isprime(ll now)

void getpri()

bool cmp(ll a, ll b)

bool check(ll num, ll now)

void dfs(int num, ll now, ll s)

if (now % (pri[num] - 1) == 0 && check(num, now / (pri[num] - 1)))

ans = min(ans, s / (pri[num] - 1) * pri[num]);

ll ord = (pri[num] - 1);

for (; now % ord == 0; ord *= pri[num])

dfs(num + 1, now / ord, s / (pri[num] - 1) * pri[num]);

dfs(num + 1, now, s);

}void solve(ll n)

int main ()

}

尤拉函式 euler

o 找新朋友 1 尤拉函式 euler 在數論,對正整數n,尤拉函式是 少於或等於n的數中與n 互質 的數的數目。互質 公約數只有 1 的兩個整數,稱為互質整數。即 最大的公約數也就是 1 euler 新年快到了,豬頭幫協會 準備搞乙個聚會,已經知道現有會員n人,把會員從1到n編號,其中會長的號碼是...

PHP簡單實現尤拉函式Euler功能示例

本ohsge文例項講述了php簡單實現尤拉函式euler功能。分享給大家供大家參考,具體如下 尤拉函式ph n 的意思是所有小於n且與n互質的個數。比如說ph 10 4 如下 ohsge now re程式設計客棧turn res res euler 10 var duwww.cppcns.commp...

素數線性篩 尤拉Euler篩

prime陣列中的素數是遞增的,當i能整除prime j 那麼i prime j 1 這個合數肯定被prime j 乘以某個數篩掉。因為i中含有prime j prime j 比prime j 1 小,即i k prime j 那麼i prime j 1 k prime j prime j 1 k ...