1. 程式人生 > >[洛谷P5106]dkw的lcm:尤拉函式+容斥原理+擴充套件尤拉定理

[洛谷P5106]dkw的lcm:尤拉函式+容斥原理+擴充套件尤拉定理

分析

考慮使用尤拉函式的計算公式化簡原式,因為有:

\[lcm(i_1,i_2,...,i_k)=p_1^{q_{1\ max}} \times p_2^{q_{2\ max}} \times ... \times p_m^{q_{m\ max}}\]

其實就是分解質因數,丟到那個尤拉函式計算式子裡:

\[\varphi(lcm(i_1,i_2,...,i_k))=\prod (p_i-1)p_i^{q_{i\ max}-1}\]

容易發現可以分開討論每個質數,計算每個\(p_i^j\)在多少種\(i_1 \sim i_k\)的取值方案中作為某一項的倍數出現,這裡可以容斥做,然後把產生的貢獻乘到答案裡即可。質數取模的話,不是有擴充套件尤拉定理嘛,模個\(1e9+6\)

就好了。

時間複雜度?不知道,大概在\(O(n) \sim O(nlogn)\)之間吧。

程式碼

int main(){
    n=read(),k=read();
    pre_process();//這個是篩質數
    int tot=qpow(n,k,MOD-1);
    rin(i,1,cnt){
        int p=prm[i],temp=n/p;
        ans=1ll*ans*qpow(p-1,(tot-qpow(n-temp,k,MOD-1)+MOD-1)%(MOD-1),MOD)%MOD;
        while(1){
            temp/=p;if(!temp) break;
            ans=1ll*ans*qpow(p,(tot-qpow(n-temp,k,MOD-1)+MOD-1)%(MOD-1),MOD)%MOD;
        }
    }
    printf("%d\n",ans);
    return 0;
}