zgg與占卜師

2022-04-29 09:03:12 字數 1223 閱讀 9245

給出乙個整數$n$的標準分解,求經過多少次$n=\phi(n)$操作後,可以使$n=1$。標準分解式中,質數$p \le 10^5$,次數$t \le 10^9$。多組資料,最後再輸出所有答案中的最大值。

尤拉函式的公式:$\phi(n)=\sum p_i^\cdot(p_i-1)$,其中$p_i$、$t_i$為標準分解後得到的質因數和對應的次數。

根據尤拉函式的公式可以發現,每次進行$n=\phi(n)$的操作後,所有的質數$p$的次數都減去$1$,然後又多出來$(p-1)$的質因數。而一旦$n$變為$1$,僅當質因數$p$僅有$2$。

因為所有的質因數結果不斷地操作,最後都要通過$2$這個媒介再變為$1$,且這個過程中$2$的個數必然大於$0$(因為每次必有乙個$p$變為$p-1$,而當$p$不為$2$時,$p-1$必然包含$2$這個因子)。

由於其它質因數變化是和$2$的變化同時進行的,且$2$的變化貫穿這個過程(若原本的$n$包含$2$這個質因子時),而每次操作$2$的次數減一,所以將其它的質數都拆解成2,最後$2$的次數便是答案。

若原本的$n$不包含$2$這個質因子,則第一次操作時$2$的次數不減少(都是$0$),而後面的操作與前面一樣,故答案為$2$的次數加一。

根據分析,可以知道最重要的東西是乙個數可以拆解為多少個$2$,對此我們假設要拆解的數為$x$,對$x$進行分類討論。

對於任意乙個數$x$,都由小於$x$的數貢獻答案,所以遞推求就好了。

**:

1 #include 2

3int f[100010], phi[100010], two[100010];4

inttest, n, a, b, flag;

5long

long

ans, maxans;67

intmain()819

}20for (int i = 2; i < 100000; i++)

2125 scanf("

%d", &test);

26 maxans = 0;27

while (test--)

2837 ans = ans - flag + 1

;38 printf("

%lld\n

", ans);

39if (ans > maxans) maxans =ans;40}

41 printf("

%lld

", maxans);

42 }

PM與工程師

過節前看到一篇文章,講產品專案就應該由工程師來主導,但國內讓pm去驅動專案,搞得亂七八糟,很惱火,怎麼可能做出一款好產品來呢?很顯然,寫這篇文章的是一位憤怒的工程師,angry engineer!我跟他至少有兩點共鳴 1 國內的pm確實常常折騰工程師,甚至不乏 把工程師當工具對待 的情況。2 如果工...

nowcoder xinjun與陰陽師

看似是完全揹包的題目 可以看成是稍微加了種類限制的01揹包 所以三重迴圈解決 第一重是種類 第二重是容量 第三重是每一種中選擇乙個模式不斷更新dp一維陣列 include using namespace std const int n 1000 5 int n,m,dp n vector a n b...

桂子與工程師

quote quote b 原題如下 b quote 有家工廠的技術科有三隻資料櫥,每只櫥子各有兩把鑰匙,科里三個工程師隨時都需要開啟這三個櫥子。請問,在不增加鑰匙的情況下,怎樣才能便每人隨時都可以開啟這三個櫥子的任何乙個?當然,除了工程師外別人是不允許拿到鑰匙的.quote b 解答如下 b qu...