[HDU 5728] PowMod (尤拉函式的積性+尤拉公式降冪+尤拉篩)
HDU - 5728
求
K=∑i=1mϕ(i∗n)mod1000000007
其中n 是 square-free number
求ans=KKKK..modp
先求
由於
對於素因子
如果
而
他們除以
設
遞迴計算即可,複雜度不會超過
再求
利用尤拉定理降冪
遞迴計算,
另外在尤拉函式打表那塊,由於
不然容易 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
GuGuFishtion(hdu 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來說