HDU 5407 CRB and Candies (2015年多校比赛第10场)

1.题目描述:点击打开链接

2.解题思路:本题要求LCM(C(n,0), C(n,1),..., C(n,n)),官方题解是转化为求解LCM(1,2,3,...n+1)/(n+1),然而这种做法还是觉得太陌生,不妨试着用学过的唯一分解定理去做。


首先,求这n+1个数的LCM,实际上就是求所有小于n的素数中,对于每一个素数Pi,哪一项的指数最大,然后把他们连乘起来即可得到LCM值。因此,问题转化为确定每一个pi的最大指数。这里要用到Kummer定理来解决,Kummer定理告诉我们这样一个事实:p恰好整除C(n,k)的指数等于n和k都写成p进制数时候,ni


找到指数之后,利用快速幂计算乘积即可得到答案。

3.代码:

#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;

#define me(s) memset(s,0,sizeof(s))
#define pb push_back
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef pair  P;


const int MOD = 1e9 + 7;
const int N = 1000000 + 10;

int vis[N];
int primes[N];
int idx;
void seive()
{
	int m = sqrt(N);
	for (int i = 2; i <= m; i++)
	if (!vis[i])
	for (int j = i*i; j0)
	{
		if (k & 1)res = res*a%MOD;
		a = a*a%MOD;
		k >>= 1;
	}
	return res;
}

int get_pow(int n, int p)
{
	int cnt = 0;
	int tmp[30];
	while (n>0)
	{
		tmp[cnt++] = n%p;
		n /= p;
	}
	int res = 0, flag = 0;
	for (int i = 0; i

你可能感兴趣的:(数学——数论,其他OJ习题)