1. 程式人生 > >5728 PowMod 尤拉函式(降冪)+數學推倒

5728 PowMod 尤拉函式(降冪)+數學推倒

ans=kkkk.點選打

思路:

很不錯的一個題目,知道求出k之後尤拉降冪遞迴可求,但是仍然無法再符合條件的時間內求出k,化簡了一些式子. 根據尤拉函式的性質可以分成i和n互質不互質兩種情況,然後就不會了...

對於n的質因數,考慮n無平方因子(square-free) ,所以存在gcd(n,n/p)==1.由尤拉函式性質 φ(ab)=φ(a)*φ(b)

解釋一下 φ(i*n*p) p是n的質因子,那麼有: φ(i*n*p)= φ(i*n)*p (由尤拉篩性質可得).

我們將i分為兩種情況,一種是i和n互質,也就是上面第一種,然後是不互質,就是第二種.主要考慮第二種吧,如果不互質,那麼

該數一定可以化成 k*p,我們上面就是列舉這個k,這樣每次最多有m/p,這樣複雜度下降是log級別的.φ(p)+1 和後面那

展開,因為n和i都有p,所以n再拿出一個p,這是i*p 正好是前面缺少的那部分i,兩者提公因式.

這題目T了好多發,一直再實驗,這裡寫了兩種預處理了n所有的質因子m和直接列舉素數判斷是否為質因子,預處理快了一

倍多.

另外,採用遞迴求的話需要預處理出當n為1的時候的尤拉函式的字首和,而且根據上面的式子找到一個n的素因子即可.

遞迴求無限k就不多說了很簡單

具體見程式碼.

#include<bits/stdc++.h>

using namespace std;
const int maxn = 1e7 + 10;
typedef long long ll;
const ll Mod = 1e9 + 7;
int n,m,p;
bool vis[maxn];
int prime[maxn],phi[maxn];
ll sum[maxn];
int vt[maxn];
int num,cnt;
void init()
{
	phi[1] = 1;
	 cnt = 0;
	for(int i = 2;i < maxn;i++)
	{
		if(!vis[i])
		{
			prime[cnt++] = i;
			phi[i] = i - 1;
		}
		for(int j = 0;j < cnt && (ll)prime[j] * i < maxn;j++)
		{
			vis[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);
		}
	}
	sum[0] = 0;
	for(int i = 1;i < maxn ;i++)
	sum[i] = (sum[i - 1] + phi[i])%Mod;
	return ;
}

void yinzi()
{
	num = 0;
	int res = n;
	for(ll i = 2; i * i <= res;i++)
	{
		if(res % i == 0 && !vis[i])
		{
			vt[num++] = i;
			while(res % i == 0)
			res /= i;
		}
	}
	if(res > 1 && !vis[res])
	vt[num++] = res;
	return ;
}

ll solve(int n,int m)
{
	if(!n || !m) return 0;
	if(n == 1)	 return sum[m];
	if(m == 1)   return phi[n];
	/*for(int i = 0; i < cnt ;i++)
	{
		int w = prime[i];
		if(w > n)
		continue;
		if(n % prime[i] == 0)
		 {
		 	
		 	return ((w - 1)*solve(n/w,m)%Mod+solve(n,m/w))%Mod;
		 }
	}*/
	for(int i = 0;i < num;i++)
	{
		int w = vt[i];
		if(n % w == 0)
		return (phi[w]*solve(n/w,m)%Mod+solve(n,m/w))%Mod;
	}
	return 0;
}
ll qmod(ll x,ll y,ll mod)  
{  
    ll res=1;  
    x %= mod;
    while(y)  
    {  
        if(y&1)  
        res=res*x%mod;  
        x=x*x%mod;  
        y>>=1;  
    }  
    return res%mod;  
} 



ll cal(ll k,int x)
{
	if(x == 1) return 0;
	ll tmp = cal(k,phi[x]);
	return qmod(k,tmp+phi[x],x);
}
int main()
{
	init();
	while(~scanf("%d %d %d",&n,&m,&p))
	{
		yinzi();
		ll k = solve(n,m);
		ll ans = cal(k,p);
		printf("%lld\n",ans);
	}
}


#include<bits/stdc++.h>

using namespace std;
const int maxn = 1e7 + 10;
typedef long long ll;
const ll Mod = 1e9 + 7;
int n,m,p;
int prime[maxn],phi[maxn];
ll sum[maxn];
int vt[maxn];
int num,cnt;
void init()
{
	phi[1] = 1;
	 cnt = 0;
	for(int i = 2;i < maxn;i++)
	{
		if(phi[i] == 0)
		{
			prime[cnt++] = i;
			phi[i] = i - 1;
		}
		for(int j = 0;j < cnt && (ll)prime[j] * i < maxn;j++)
		{
			if(i % prime[j] == 0)
			{
				phi[i*prime[j]] = phi[i] * prime[j];
				break;
			}
			else
				phi[i*prime[j]] = phi[i] * (prime[j] - 1);
		}
	}
	sum[0] = 0;
	for(int i = 1;i < maxn ;i++)
	sum[i] = (sum[i - 1] + phi[i])%Mod;
	return ;
}

ll solve(int n,int m)
{
	if(!n || !m) return 0;
	if(n == 1)	 return sum[m];
	if(m == 1)   return phi[n];
	for(int i = 0; i < cnt ;i++)
	{
		int w = prime[i];
		if(w > n)
		continue;
		if(n % prime[i] == 0)
		 {
		 	
		 	return ((w - 1)*solve(n/w,m)%Mod+solve(n,m/w))%Mod;
		 }
	}
	return 0;
}
ll qmod(ll x,ll y,ll mod)  
{  
    ll res=1;  
    x %= mod;
    while(y)  
    {  
        if(y&1)  
        res=res*x%mod;  
        x=x*x%mod;  
        y>>=1;  
    }  
    return res%mod;  
} 

ll cal(ll k,int x)
{
	if(x == 1) return 0;
	ll tmp = cal(k,phi[x]);
	return qmod(k,tmp+phi[x],x);
}
int main()
{
	init();
	while(~scanf("%d %d %d",&n,&m,&p))
	{
		ll k = solve(n,m);
		ll ans = cal(k,p);
		printf("%lld\n",ans);
	}
}


f(n,m)=i=1mϕ(i×n)=ϕ(p)i=1&&i%p0mϕ(i×np)+i=1mpϕ(i×p×n)=ϕ(p)i=1&&i%p0mϕ(i×np)+pi=1mpϕ(i×n)=ϕ(p)i=1&&i%p0mϕ(i×np)+(ϕ(p)+1)i=1mpϕ(i×n)=ϕ(p)i=1mϕ(i×np)+

相關推薦

5728 PowMod 函式降冪+數學推倒

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

函式模板

#include <iostream> #include <cmath> using namespace std; int oula(int n) { int ans=n; int i; for(i=2;i<=sqrt(n);i++) {

函式總結

尤拉函式 定義 尤拉函式ϕ(n)是不超過n且和n互質的正整數的個數。尤拉函式φ(n)的作用就是轉化,從而簡化運算(小性質:n的所有質因子之和=eular(n)*n/2); 下面直觀地看看尤拉函式: n 1 2 3 4

函式 數論 + 唯一分解定理

尤拉函式 初步認識: 在數論,對正整數n,尤拉函式是小於n的正整數中與n互質的數的數目(φ(1)=1)。此函式以其首名研究者尤拉命名(Euler's totient function),它又稱為Euler's totient function、φ函式、尤拉商數等。 例如φ

HDU 5728 PowMod 函式 遞迴

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

BZOJ4804 心算莫比烏斯反演+函式+線性篩

  一通套路後得Σφ(d)μ(D/d)⌊n/D⌋2。顯然整除分塊,問題在於怎麼快速計算φ和μ的狄利克雷卷積。積性函式的卷積還是積性函式,那麼線性篩即可。因為μ(pc)=0 (c>=2),所以f(pc)還是比較好算的,討論一波即可。 #include<iostream> #inclu

2018.12.17【BZOJ4802】函式Pollard-Rho

傳送門 解析: 對於 n = ∏

hdu3221 擴充套件定理降冪大法

題目連結:http://acm.hdu.edu.cn/showproblem.php?pid=3221 題解:首先很容易發現遞推公式fn=fn-1*fn-2;寫出前幾項a,b,a*b,a*b^2,a^

hiho 1298 數論·五 函式 函式篩選板子

描述 小Hi和小Ho有時候會用密碼寫信來互相聯絡,他們用了一個很大的數當做金鑰。小Hi和小Ho約定了一個區間[L,R],每次小Hi和小Ho會選擇其中的一個數作為金鑰。 小Hi:小Ho,這次我們選[L,R]中的一個數K。 小Ho:恩,小Hi,這個K是多少啊? 小Hi:這個K嘛,不如這一次小Ho你自己想辦法

hdu3501 函式或容斥原理莫比烏斯函式

題目連結:http://acm.hdu.edu.cn/showproblem.php?pid=3501 題解1:顯然,本體可以用容斥原理,求出每個數的倍數情況,其係數就是莫比烏斯函式。 題解2:對於整

函式提供1到N中與N互質的數

當個板子放著,具體是看了這篇部落格:尤拉函式求法與應用 尤拉函式用希臘字母φ表示,φ(N)表示N的尤拉函式. 對φ(N)的值,我們可以通俗地理解為小於N且與N互質的數的個數(包含1). //直接求解尤拉函式 int euler(int n){ //返回euler(n

函式求與n互質的數的個數

求解與n(1-n-1)互質的質因子的個數 解析:(轉) 定義:對於正整數n,φ(n)是小於或等於n的正整數中,與n互質的數的數目。     例如:φ(8)=4,因為1,3,5,7均和8互質。 性質:1.若p是質數,φ(p)= p-1. 2.若n是質數p的k

hdu2588函式的運用

Problem Description The greatest common divisor GCD(a,b) of two positive integers a and b,sometimes written (a,b),is the largest divisor

數論學習筆記 函式 一些性質和運用內建杜教篩

定義 在數論中,對正整數n,尤拉函式是小於等於n的數中與n互質的數的數目。並且用符號φ(n)表示一個整數的尤拉函式。例如φ(8)=4。特殊的φ(1)=1。 一些尤拉函式的性質 性質一 對於一個質數n,φ(n)=n−1。 證明: 因為n是質數。

BZOJ 2818 Gcd(函式+質數篩選

2818: Gcd Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 9108  Solved: 4066 [Submit][Status][Discuss] De

三個重要的同餘式——威爾遜定理,費馬小定理,定理擴充套件

威爾遜定理 (p−1)!≡p−1≡−1(modp)(pisaprime)(p−1)!≡p−1≡−1(modp)(pisaprime) 由於(p−1)!(p−1)!較大,實際應用不是很廣泛 簡單的證明 費馬小定理 假

[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】【數論】【函式】【降冪遞迴取模】【積性函式

【連結】 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~