1. 程式人生 > >[HDU 5728] PowMod (尤拉函式的積性+尤拉公式降冪+尤拉篩)

[HDU 5728] PowMod (尤拉函式的積性+尤拉公式降冪+尤拉篩)

HDU - 5728

K=i=1mϕ(in)mod1000000007
其中 n是 square-free number
ans=KKKK..modp

先求 K
由於 ϕ(n)是積性函式,所以對於 n的每個素因子可以提出來計算
i=1mϕ(i×n)=(pk1)×i=1mϕ(i×npk)+i=1mpkphi(i×n)
對於素因子 pk,如果 i中不包含這個因子,提出來是 ϕ(pk)=pk1
如果 i中包含這個因子,那麼提出來就是 pk,所以在後面加上多減的這一項
1m中共有 mpk個包含 pki,為 1×pk2×pk
他們除以 pk後是 1

2、…mpk,所以後面 i是從 1mpk
K=sum(n,m)=(pk1)×sum(npk,m)+sum(n,mpk)
遞迴計算即可,複雜度不會超過 (logN)

再求 ans
利用尤拉定理降冪
ax=ax%ϕ(p)+ϕ(p)modp
遞迴計算,ϕ(p)很快就變成 1了,所以複雜度不會超過 (logN)

另外在尤拉函式打表那塊,由於 N107 ,最好用 (N)的尤拉篩
不然容易 TLE (雖然我用埃氏篩沒 TLE

#pragma comment(linker, "/STACK:102400000,102400000")
#include <cstdio>
#include <iostream>
#include <cstdlib> #include <cstring> #include <algorithm> #include <cmath> #include <cctype> #include <map> #include <set> #include <queue> using namespace std; typedef pair<int,int> Pii; typedef long long LL; typedef unsigned long long ULL; typedef
double DBL; typedef long double LDBL; #define MST(a,b) memset(a,b,sizeof(a)) #define CLR(a) MST(a,0) #define SQR(a) ((a)*(a)) const int maxn=1e7+10, MOD=1000000007; int N,M,P; bool nprim[maxn]; int phi[maxn]; int phi_sum[maxn]; int prime[maxn], pcnt; void prime_init(); LL SUM(int,int,vector<int>&); LL PowMod(LL,LL); LL Pow(LL,LL,LL); int main() { #ifdef LOCAL freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); #endif prime_init(); while(~scanf("%d%d%d", &N, &M, &P)) { vector<int> fact; int tem=N; for(int i=0; i<pcnt && prime[i]<=tem; i++) if(tem%prime[i]==0) { tem/=prime[i]; fact.push_back(prime[i]); } LL K = SUM(N,M,fact); printf("%lld\n", PowMod(K,(LL)P)); } return 0; } LL PowMod(LL k, LL p) { if(p==1) return 0; LL tp=PowMod(k,phi[p]); LL res = Pow(k,tp+phi[p],p); return res; } LL Pow(LL x, LL n, LL p) { LL res=1; while(n) { if(n&1) res=res*x%p; x=x*x%p; n>>=1; } return res; } LL SUM(int n, int m, vector<int>& fact) { if(n==1) return phi_sum[m]; if(m==1) return phi[n]; if(m<1) return 0; for(int i=0; i<(int)fact.size(); i++) if(n%fact[i]==0) return (SUM( n, m/fact[i], fact) + (LL)(fact[i]-1)*SUM( n/fact[i], m, fact)%MOD)%MOD; return 0; } void prime_init() { phi[1]=1; for(int i=2;i<maxn;i++) { if(!nprim[i]) {phi[i]=i-1; prime[pcnt++]=i;} for(int j=0;j<pcnt;j++) { if(i*prime[j]>=maxn)break; nprim[i*prime[j]]=true; if(i%prime[j]==0) { phi[i*prime[j]]=phi[i]*prime[j];break; } else { phi[i*prime[j]]=phi[i]*(prime[j]-1); } } } for(int i=1; i<maxn; i++) phi_sum[i] = (phi_sum[i-1]+phi[i])%MOD; }

相關推薦

[HDU 5728] PowMod 函式+公式降冪+

HDU - 5728 求 K=∑i=1mϕ(i∗n)mod1000000007 其中 n是 square-free number 求 ans=KKKK..modp 先求 K 由於 ϕ(n)是積性函式,所以對於 n的每個素因子可以提出

HDU 5728 PowMod數論,函式的各種性質

[題意] k=∑i=1mϕ(i∗n)%1000000007 其中n為無平方因子的數,求 ans=kkkk...k%p [分析] n無平方因子說明n可以表示為n=p1∗p2∗...∗pl

HDU 5728 PowMod數論+遞迴

Description 定義,其中n無平方因數,是尤拉函式 現給出n,m,p,求 ,式子中k有無窮個 Input 第一行為一整數T表示用例組數,每組用例佔一行包括三個整數n,m,p (T&l

hdu 5728 PowMod】【數論】【函式】【降冪遞迴取模】【函式

【連結】 http://acm.hdu.edu.cn/showproblem.php?pid=5728 【題意】 n是無平方因子的數 定義k=∑mi=1φ(i∗n) mod 1000000007,求K^k^k^k......%p 【思路】 先尤拉性質求出k

hdu 5728 PowMod】【數論】【函式】【降冪遞迴取模】【函式

【連結】 【題意】 n是無平方因子的數 定義k=∑mi=1φ(i∗n) mod 1000000007,求K^k^k^k......%p 【思路】 先尤拉性質求出k,再用尤拉降冪,A^B=A^B%phi(C)+phi(C)  (mod C)求出答案 ∑(i=1~

HDU 5728 PowMod 函式 遞迴

感覺智商被掏空… 定義k=∑mi=1φ(i·n)mod1000000007 n是無質因子平方項的數. 求ans=kkkk...k(modp),其中k有無窮多個 資料範圍:1≤n,m,

UVA 12493 Stars (函式--求1~n與n互質的個數

大致題意:圓上有偶數n個點,每m個點連起來,最後可以把所有點串聯起來就合法。問有多少個m可以完成串聯,串聯後形狀相同的算重複 n <2^31 思路:可以寫個暴力程式,可以發現只要m與n互質,就可以完成串聯,所以用尤拉函式解決 證明: 設cnt為當第一次達到原點時

莫比烏茲反演, 函式等亂七八糟的數論公式推導題

前言 最近學了些數論函式,有了一些小小小小的套路經驗 強烈推薦以下幾個部落格 數論函式變換總結 金策大佬 超詳細 課件 狄利克雷卷積 定義:(f×g)(n)=∑d|nf(d)g(nd)(f×g)(n)=∑d|nf(d)g(nd) 方

hdu 5072 Coprime容斥+快速統計cnt個數與x互質的個數

題目連結: 轉換成求滿足條件的反面: ①:a和b,c互質,b和c不互質 ②:a和b,c不互質,b和c互質 於是就是列舉每個數,找出與他互質的個數與不互質的個數 答案就是:互質個數*不互質個數/2 至於為什麼要除2,我看得還不是很懂 然後就變成了:怎樣快速統計

Python入門 第三天set、函式、切片、迭代、列表生成式

Python中什麼是set dict的作用是建立一組 key 和一組 value 的對映關係,dict的key是不能重複的。 有的時候,我們只想要 dict 的 key,不關心 key 對應的 value,目的就是保證這個集合的元素不會重複,這時,set就派上用場了。

[模板] 函數 && 杜教

n) play amp inline 固定 gcd math clas 卷積 積性函數 數論函數指的是定義在正整數集上的實或復函數. 積性函數指的是當 \((a,b)=1\) 時, 滿足 \(f(a*b)=f(a)*f(b)\) 的數論函數. 完全積性函數指的是在任何情況下

5728 PowMod 函式降冪+數學推倒

ans=kkkk.點選打 思路: 很不錯的一個題目,知道求出k之後尤拉降冪遞迴可求,但是仍然無法再符合條件的時間內求出k,化簡了一些式子. 根據尤拉函式的性質可以分成i和

杜教整除分塊,函式與莫比烏斯,狄利克雷卷

參考資料 整除分塊: 當我們求∑ni=1f([ni])∑i=1nf([ni])的時候,如果1到n求一遍感覺太傻了,因為會有很多重複的計算,例如:n=10000時,i在[101,111]時,都有[ni]=9[ni]=9,所以我們只需要對所有數分成如上的一個

另類容斥和函式巧妙應用HDU--5514

There are mm stones lying on a circle, and nn frogs are jumping over them.  The stones are numbered from 00 to m−1m−1 and the frogs are nu

HDU 6390 GuGuFishtion函式+莫比烏斯反演

#include<bits/stdc++.h> using namespace std; #define debug puts("YES"); #define rep(x,y,z) for(int (x)=(y);(x)<(z);(x)++) #def

GuGuFishtionhdu 6390 函式+莫比烏斯函式

題目: 題意: 設 ,已知m,n,p,求   。 思路: 尤拉函式性質: (p為質數)。 一個數肯定能表示成若干個質數的乘積,因此,設。   (其餘的項上下展開後都可以約掉,因為它們互質) 設 。 設 設

2016多校訓練一 PowMod,hdu5728函式+指數迴圈節

Declare:k=∑mi=1φ(i∗n)mod1000000007n is a square-free number.φ is the Euler's totient function. find:ans=kkkk...kmodp There are infini

HDU 5728 (函式)

超級冪的弱化版本這裡 然後就是把底數k求出來,假設p是n的一個質因數,因為n無平方因子,所以gcd(n,pn)=1,所以可以得到f(n,m)=∑i=1mϕ(i×n)=ϕ(p)∑i=1&am

POJ3090 Visible Lattice Points 數論:函式模板

題目連結:傳送門 思路:   所有gcd(x, y) = 1的數對都滿足題意,然後還有(1, 0) 和 (0, 1)。 #include <iostream> #include <cstring> using namespace std; const in

hdu5528(函式+函式)

題意:設(題目已把f(6)的表給出),,給定n(n<=1e9),求g(n) 最主要的是求f(m),考慮到模數大於0的情況比較多,所以考慮考慮求ij mod n==0的情況。。 然後其實從題目給的表中看出對一個a來說,他0的個數和gcd(a,n)有關,其實也很容易證明,對一個數a來說