BZOJ3643 Phi的反函式(數論 dfs)

2021-07-27 20:53:51 字數 1149 閱讀 8101

這裡放傳送門

這題記得某天學長出過胡策。。然後一臉懵逼:這玩意兒也能求?!

這題用到了乙個非常常用非常重要的性質:對於long long級別的數字,它不同的質因子個數非常小,最多不會超過15個。因為最小的十來個質數乘起來就已經變得很大了。這就說明我們可以用爆搜來搞這個東西。對於這道題來說我們知道乙個數的phi就是一坨質數和一坨(質數-1)的乘積,那麼我們的任務就是把這些東西構造出來。

列舉所有的prime,如果這個prime合法的話那麼prime-1一定是給定的x的約數。如果x不能整除prime-1的話就根本不用考慮這個質數了,否則就開始考慮把prime這個東西構造到答案裡面去。首先除掉乙個prime-1,答案乘以乙個prime;接下來就乙個乙個地除掉prime,然後每次都進去搜一次直到不能除了為止,這相當於列舉了這個質因數的次數。

然而還有乙個問題就是對於那些很大的質數沒法篩出來,這就要利用每個數大於x√

的質因子只會有乙個,並且這個質因子一定表現為prime-1的形式,那麼每次就判斷一下當前剩下的這個數+1是不是乙個大質數,如果是大質數的話就記錄答案並且不用繼續往下搜了,因為再往下搜答案只會再變大。

#include

#include

#include

#include

#define n 50000

using

namespace

std;

int x,prm[50010];

long

long ans;

bool ext[50010];

void get_prime()

}}bool is_prime(long

long x)

void search(int last,long

long res,long

long sum)

if (res>floor(sqrt(x))&&is_prime(res+1))//注意必須當剩下的數大於sqrt(x)的時候才能算成大質數不然會錯

for (int i=last+1;i<=prm[0];i++)

}if (prm[i]>res) return;

}}int main()

常用的結論!常用的結論!常用的結論!

注意搜尋的姿勢!姿勢寫不對怎麼改怎麼t!

BZOJ 3643 Phi的反函式

by zky 尤拉函式 思路 dfs ans一定是a1 b1 a2 b2 ak bk,所以n一定是a1 b1 1 a2 b2 1 ak bk 1 a1 1 a2 1 ak 1 這樣,我們就可以dfs有哪些質數是a,然後用n除以它們 1後再看是不是ak b1 1 相乘的形式。如果在外面定義了ij,就不...

bzoj3643 Phi的反函式 數學 搜尋

題意 已知 x 求出 phi n x 的最小 n 不得不說今天刷了一堆 相對而言 思博大爆搜之後來這麼一道相對有思考價值的數學題真是強啊 首先我們需要記住乙個基本事實 在 int 範圍內,每個數的同乙個質因數不會成為這個數字的 31 次方,乙個數存在的不同質因數不會超過 10 個。理由很簡單 首先 ...

BZOJ3643 尤拉函式,搜尋

給定乙個數x,我們可以求出phi x 那給定乙個數k k 1e6 如何求出phi x k的解呢 容易知道k為奇數時唯有k 1有解x 1,其餘無解 假設n有素冪因子分解 n cdots 因為 phi x prod limits p j 1 所以 1由此篩選出一些質數,同時記錄它的最高冪次 然後用dfs...