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<ki的个数。这里的ni指的是n写成p进制数时候的第i项。实际上等价于n-k和k这两个数按照p进制数相加时,发生的“进位”的次数。由于我们要找最大的指数,即我们希望进位的次数可以尽可能的多。在草稿纸上举几个例子演算后即可发现,如果在第i位第一次发生了进位现象,那么进位后剩下的数一定小于p-1,因为在p进制中,两个加数最大只能是p-1,然而如果想要发生进位后剩下的数也等于p-1,即相加后的结果应该是p+(p-1),这显然是不可能的。这样,只要找到了这个数,那么可以构造一个k,使得后面所有位都发生进位。由此,我们就找到了最大指数。

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

3.代码:

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<algorithm>
#include<cassert>
#include<string>
#include<sstream>
#include<set>
#include<vector>
#include<stack>
#include<map>
#include<queue>
#include<deque>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<ctime>
#include<cctype>
#include<functional>
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 <ll, int> 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; j<N; j += i)
		vis[j] = 1;
	for (int i = 2; i<N; i++)
	if (!vis[i])
		primes[idx++] = i;
}

ll pow_mod(ll a, int k)
{
	ll res = 1;
	while (k>0)
	{
		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<cnt - 1; i++)
	if (tmp[i]<p - 1 + flag)//找到第一个小于p-1的数
	{
		res++;
		flag = 1;
	}
	return res;
}

int main()
{
	seive();
	int T;
	for (scanf("%d", &T); T--;)
	{
		int n;
		scanf("%d", &n);
		ll ans = 1;
		for (int i = 0; i<idx&&primes[i] <= n; i++)
		{
			ans = ans*pow_mod(primes[i], get_pow(n, primes[i])) % MOD;
		}
		printf("%I64d\n", ans);
	}
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-14 23:19:03

HDU 5407 CRB and Candies (2015年多校比赛第10场)的相关文章

HDU 5411 CRB and Puzzle (2015年多校比赛第10场)

1.题目描写叙述:pid=5411">点击打开链接 2.解题思路:本题实际是是已知一张无向图.问长度小于等于m的路径一共同拥有多少条. 能够通过建立转移矩阵利用矩阵高速幂解决.当中,转移矩阵就是输入时候的邻接矩阵,同一时候多添加最后一列,都置为1.表示从i開始的,长度不超过M的路径的答案总数(最后一行的1~n列为全0行,能够理解为空集),那么把转移矩阵自乘M-1次后就是路径长度为M的转移矩阵(这里的路径长度指的是顶点的个数.顶点=边数+1,因此仅仅须要乘M-1次). 为何便于求和.能够设置

HDU 5414 CRB and String (2015年多校比赛第10场)

1.题目描写叙述:点击打开链接 2.解题思路:本题要求推断字符串s是否能通过加入若干个字符得到字符串t. 首先,能够知道,s必须是t的一个子串(注意:不是连续子串). 第二.因为插入的新字符和它前面的字符c不同.因此假设t中有cnt个连续的c.那么在s中也必须有cnt个连续的c.因此.仅仅要能够满足这2个条件,就一定能够成功实现转化. 那么该怎样做呢?两者能够结合起来推断,用i,j分别表示s,t串中当前扫描的字符的下标.首先从字符串t開始扫描,看第一个字符c是否连续,一直到不连续为止,那么依据上

HDU 5410 CRB and His Birthday (2015年多校比赛第10场)

1.题目描述:点击打开链接 2.解题思路:本题是完全背包问题的一种变形.根据题意描述,每种物品的价值随着A[i]是线性变化的,但是并不随着B[i]线性变化,B[i]仅仅是在第一次挑选第i件物品是才算入,其他时候均不算入.因此,这里的状态要比普通的完全背包增加一个维度:是否是第一次选第i件物品,即用(i,j,flag)表示当前背包容量为j时,是否为第一次选第i件物品时的最大价值.那么不难得到如下状态转移方程: dp(i+1,j,0)=max{dp(i,j,0),dp(i,j,1)}; dp(i+1

HDU 5399 Too Simple (2015年多校比赛第9场)

1.题目描述:点击打开链接 2.解题思路:本题分情况讨论.比赛时候真是想的太简单了,以为就是(n!)^(cnt-1).最终无限WA.本题有几个特殊情况需要额外判断.首先,如果输入的时候,有某一行不是-1且有两个数映射到同一个数,那么必然无解,ans=0.其次,如果不存在-1,需要从第m个函数一步步映射到第1个函数,检查一下最后是否真的变成了自身映射.最容易想到的情况就是有至少一个-1,那么最后答案就是(n!)^(cnt-1). 3.代码: //#pragma comment(linker, "/

HDU 5400 Arithmetic Sequence (2015年多校比赛第9场)

1.题目描述:点击打开链接 2.解题思路:本题利用扫描法解决.根据题意描述,[L,i)和[i,R)区间都构成了等差数列,因此可以实现用L[i],R[i]来维护从i开始向左向右可以延伸的最远长度,如果d1和d2不等,那么答案就是L[i]*R[i]求和,否则就是R[i]求和. 3.代码: //#pragma comment(linker, "/STACK:1024000000,1024000000") #include<iostream> #include<algorit

Hdu 5407 CRB and Candies (找规律)

题目链接: Hdu 5407 CRB and Candies 题目描述: 给出一个数n,求lcm(C(n,0),C[n,1],C[n-2]......C[n][n-2],C[n][n-1],C[n][n])%(1e9+7)是多少? 解题思路: 刚开始的时候各种开脑洞,然后卡题卡的风生水起.最后就上了数列查询这个神奇的网站,竟然被我找到了!!!!就是把题目上给的问题转化为求lcm(1, 2, 3, 4 ...... n-2, n-1, n, n-1) / (n+1),扎扎就打了两个表一个lcm[n

HDU 5407——CRB and Candies——————【逆元+是素数次方的数+公式】

CRB and Candies Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 722    Accepted Submission(s): 361 Problem Description CRB has N different candies. He is going to eat K candies.He wonders how ma

hdu 5407 CRB and Candies(组合数+最小公倍数+素数表+逆元)暨2015暑期多校赛第10场

题意: 输入n,求c(n,0)到c(n,n)的所有组合数的最小公倍数. 输入: 首行输入整数t,表示共有t组测试样例. 每组测试样例包含一个正整数n(1<=n<=1e6). 输出: 输出结果(mod 1e9+7). 感觉蛮变态的,从比赛开始我就是写的这道题,比赛结束还是没写出来…… 期间找到了逆元,最小公倍数,组合数的各种公式,但是爆了一下午tle. 比赛结束,题解告诉我,公式秒杀法…… 但是公式看不懂,幸好有群巨解说,所以有些听懂了,但还是需要继续思考才能弄懂. 题解: 设ans[i]表示i

hdu 5407 CRB and Candies(素数筛选法,除法取模(乘法逆元))

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5407 解题思路: 官方题解: The problem is just to calculate g(N) =\ LCM(C(N,0), C(N,1), ..., C(N, N))g(N) = LCM(C(N,0),C(N,1),...,C(N,N)). Introducing function f(n) =\ LCM(1, 2, ..., n)f(n) = LCM(1,2,...,n), the