HDU2879:积性函数

HDU2879

题解:

参考https://blog.csdn.net/codeswarrior/article/details/81433946

关于积性函数

积性函数定义:
对于正整数n的一个算术函数 f(n),若f(1)=1,且当a,b互质时f(ab)=f(a)f(b),在数论上就称它为积性函数。若对于某积性函数 f(n) ,就算a, b不互质,也有f(ab)=f(a)f(b),则称它为完全积性的
常见积性函数: 
φ(n) -欧拉函数,计算与n互质的正整数之数目  
μ(n) -莫比乌斯函数,关于非平方数的质因子数目 
gcd(n,k) -最大公因子,当k固定的情况  
d(n) -n的正因子数目 
σ(n) -n的所有正因子之和  
σk(n) - 因子函数,n的所有正因子的k次幂之和,当中k可为任何复数。  
Idk(n) -幂函数,对于任何复数、实数k,定义为Idk(n) = n^k (完全积性)  
λ(n) -刘维尔函数,关于能整除n的质因子的数目  
γ(n),定义为γ(n)=(-1)^ω(n),在此加性函数ω(n)是不同能整除n的质数的数目
  1. he函数为积性函数
  2. p,q互质,那么he[pq] = he[p]*he[q]
  3. 且对任意质数x,he[x] = 2.
  4. 所以he[n] = 2^k,k为n的质因数的个数

代码:

#include <bits/stdc++.h>
using namespace std;
int const N = 1e7 + 10;
typedef long long ll;
int vis[N],prime[N],len;
ll n,m,k;
void prime_table(){
	for(int i=2;i<N;i++){
		if(!vis[i])	prime[len++] = i;
		for(int j=0;j<len&&i*prime[j]<N;j++){
			vis[i*prime[j]] = true;
			if(i % prime[j] == 0)	break;
		}
	}
}
ll power(ll a,ll n,ll mod){
	ll ans = 1;
	while(n){
		if(n&1)	ans = ans * a % mod;
		a = a * a % mod;
		n >>= 1;
	}
	return ans;
}
int main(){
	prime_table();
	int T;	cin>>T;
	while(T--){
		cin>>n>>m;
		k = 0;
		for(int i=0;i<len && prime[i] <= n;i++)	
			k += n / prime[i];
		printf("%lld\n",power(2ll,k,m));

	}	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_42264485/article/details/88351490