[CF396E]On Iteration of One Well-Known Function
題意:給定$n=\prod\limits_{i=1}^mp_i^{a_i}$,求$\varphi\left(\cdots\varphi\left(n\right)\cdots\right)$(有$k$個$\varphi$)
因為$\varphi(n)=n\prod\limits_{i=1}^m\dfrac{1-p_i}{p_i}$,所以每次對一個數$n$取$\varphi$,就相當于對它的每個質因數$p$,把$n$乘上$\dfrac{p-1}p$
先篩出$10^6$內的質數,然后對$n$的每一個的質因子分別考慮
記$c_p$為當前$n$的質因數分解式中$p$的指數,$k_p$為還要對$p$這個指數執行多少次$\varphi$,每次比較$c$和$k$,可以一次執行$t=\min(c_p,k_p)$次$\varphi$(一次砍掉$t$個$p$),再把$(p-1)^t$的質因數分解加到對應的$c$即可
這樣做會帶來一個問題:我們執行$\varphi$時必須要用$n$的質因子$p$,而用到的$p$可能來自最近的幾次質因數分解$p-1$,而這幾次分解并未完全分解,所以我們對于某些執行$\varphi$多次的$p$要暫緩執行(等待之前的$p-1$被分解完),記$skip_p$表示對于$p$要跳過多少次執行$\varphi$,每次如果可以執行,那么就用$t-1$更新$skip_p$(執行完這次,還要等待$t-1$波分解其他質因子就可以繼續了),否則按$skip_p$跳過幾次,這樣可以保證每次執行$\varphi$都優先使用原來的$p$,最后再把$p-1$分解留到以后使用
數據范圍很嚇人,可是這樣是挺快的2333(因為如果要執行$\varphi$一次就是$\min(c_p,k_p)$,所以這兩個數都減小得很快)
?
2018.3.28補充一些東西
?
$\varphi\left(\prod\limits_{i=1}^kp_i^{a_i}\right)=\prod\limits_{i=1}^k\varphi\left(p_i^{a_i}\right)=\prod\limits_{i=1}^kp_i^{a_i-1}\left(p_i-1\right)$
?
第一次取$\varphi$,我們可以對每個質因數分開考慮,之后的取$\varphi$操作就要小心了,如果我們對原來的$p_i$執行$\varphi$,由此產生的$p_i-1$分解之后會加到更小的$p_i$上
?
所以,①我們要從小到大枚舉$p_i$做$\varphi$操作(因為$p_i-1$分解成更小的質數)②一次性對$p_i$做完$t$次$\varphi$之后,接下來如果當前沒有$p_i$這個因子,我們要跳過這些操作(總共跳過$t-1$次)而不是直接把$k_{p_i}-1$(因為接下來同一階段的其他的$p_i-1$分解之后有可能落到這里,我們不能忽略掉這些“新來的”$p_i$)
?
#include<stdio.h> typedef long long ll; const int T=1000000; int p[1000010],f[1000010]; ll c[1000010],k[1000010],skip[1000010]; ll min(ll a,ll b){return a<b?a:b;} int main(){int m,M,i,j,x;ll t;bool flag;for(i=2;i<=T;i++){if(f[i]==0){M++;p[M]=i;f[i]=i;}for(j=1;p[j]<=f[i]&&p[j]*i<=T&&j<=T;j++)f[p[j]*i]=p[j];}scanf("%d",&m);while(m--){scanf("%d",&x);scanf("%I64d",c+x);}scanf("%I64d",&t);for(i=1;i<=T;i++)k[p[i]]=t;do{flag=0;for(i=1;i<=T;i++){x=p[i];if(c[x]){if(k[x]==0)continue;t=min(c[x],k[x]);c[x]-=t;k[x]-=t;skip[x]+=t-1;flag=1;x--;while(x>1){c[f[x]]+=t;x/=f[x];}}else if(skip[x])skip[x]--;else if(k[x])k[x]--;}}while(flag);x=0;for(i=1;i<=T;i++){if(c[p[i]])x++;}printf("%d\n",x);for(i=1;i<=T;i++){if(c[p[i]])printf("%d %I64d\n",p[i],c[p[i]]);} }轉載于:https://www.cnblogs.com/jefflyy/p/8660363.html
總結
以上是生活随笔為你收集整理的[CF396E]On Iteration of One Well-Known Function的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [译] 使用 Web3 和 Vue.js
- 下一篇: bind的那些事