题目描述

给定一个数n,求LCM(C(n,0),C(n,1),C(n,2)...C(n,n))的值,(n<=1e6)。题目链接

解题思路

很有趣的一道数论题!

看了下网上别人的做法,什么Kummer定理我还真没听说过,仔细研究一下那个鬼定理真是涨姿势了!

然而这题我并不是用Kummer那货搞的(what?).

其实这题真的很简单(不要打我),为什么这样说呢?看了下面的解释你就知道我没骗你。

首先我们看一下这个式子:LCM(C(n,0),C(n,1),C(n,2)...C(n,n))

当时我的第一感觉是:晕,还是打个表吧!结果,打表程序后台打了四个半小时也没打完=.=(时间复杂度算错了)

做这题首先你得知道这个(基本常识):

求多个数的最小公倍数,有两种方法:

1)分解质因数法

先把这几个数分解质因数,再把它们一切公有的质因数和其中几个数公有的质因数以及每个数的独有的质因数全部连乘起来,所得的积就是它们的最小公倍数。

例如,求LCM[12,18,20,60]

因为12=(2)×[2]×[3],18=(2)×[3]×3,20=(2)×[2]×{5},60=(2)×[2]×[3]×{5}

其中四个数的公有的质因数为2(小括号中的数),

三个数的公有的质因数为2与3[中括号中的数],

两个数的公有的质因数为5{大括号中的数},

每个数独有的质因数为3。

所以,[12,18,20,60]=2×2×3×3×5=180。

2)公式法

由于两个数的乘积等于这两个数的最大公约数与最小公倍数的积。

即(a,b)×[a,b]=a×b。

所以,求两个数的最小公倍数,就可以先求出它们的最大公约数,然后用上述公式求出它们的最小公倍数。

例如,求[18,20]

即得[18,20]=18×20÷(18,20)=18×20÷2=180。

求几个自然数的最小公倍数,可以先求出其中两个数的最小公倍数,

再求这个最小公倍数与第三个数的最小公倍数,依次求下去,直到最后一个为止。

最后所得的那个最小公倍数,就是所求的几个数的最小公倍数。

知道这个后,做这题选择哪种方法呢?

如果选择第二种方法,恭喜你,你绝壁和我一样想到打表滚粗!

既然第二种方法不行,肯定只能是第一种方法了。

那么要怎么做呢?

首先我们来看,对于组合数C(n,m),可以有如下变换:

C(n,m)=n!/[(n-m)!*m!]=n*(n-1)*(n-2)*....(m+1) / (n-m)!

这一步应该没问题吧!

也就是:C(n,m)=n!/[(n-m)!*m!]=n*(n-1)*(n-2)*....(m+1) / (n-m)!  = n*(n-1)*(n-2)*....(m+1)/1/2/3/4/5/..../(n-m)

我们把前后结合一下,边乘边除:

对于第k步,就相当于*(n+1-k)且/k,k={1,2,...n-m}.

我们以n=8为例:

C(8,0)=1

C(8,1)=8*7*6*5*4*3*2 /7/6/5/4/3/2/1

C(8,2)=8*7*6*5*4*3 /6/5/4/3/2/1

C(8,3)=8*7*6*5*4 /5/4/3/2/1

C(8,4)=8*7*6*5 /4/3/2/1

C(8,5)=8*7*6 /3/2/1

C(8,6)=8*7 /2/1

C(8,7)=8 /1

C(8,8)=1

结合求n个数的LCM的方法,我们将问题转换成:

找i个数共有的质数,然后相乘就可,i={1,2,..n}。

好了,你可能会说:*$#@*@,找i个数共有的质数难道不超时,而且你的代码里连一个0~n的for循环都没有,你在逗我?

不急,看下面:

首先我们明确一点,C(n,k)的最大质因数是不会大于n的。

那么对于一个质数p来说,他对"n个数的LCM"的贡献在哪?

是不是就是p^1,p^2,p^3...中的一些?

哪些呢?

前面求组合数中,我们把C(n,m)分成了分子和分母来看。

如果p^x能够整除(n-1+k),那么他有可能是满足的,但是还不够,还要看是不是会被分母抵消掉。

只有p^x满足(n-1+k)%(p^x)==0且满足k%(p^x)!=0,这个p^x才是满足的,也就是对答案才有贡献,此时ans需要乘以p。

最后一步,约约分可能会更方便:把分子分母合一下,变成了:(n-1)%(p^x)!=0,表示(n-1+k)%(p^x)==0和k%(p^x)!=0不是同时出现的,此时才满足。

OK,推导完毕。

最终方法就是:

先筛出1e6以内的所有素数p,然后判断(n-1)%(p^x)是否!=0,是的话,ans*=p。

时间复杂度

O(p_num*sqrt(n))

代码

/*
* this code is made by crazyacking
* Verdict: Accepted
* Submission Date: 2015-08-21-15.17
* Time: 0MS
* Memory: 137KB
*/
#include <queue>
#include <cstdio>
#include <set>
#include <string>
#include <stack>
#include <cmath>
#include <climits>
#include <map>
#include <cstdlib>
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
#define mod 1000000007
#define LL long long
#define ULL unsigned long long
using namespace std;
const int NN=;
bool v[NN];
int p[NN],num;
void makePrime(){
int i,j;
num=-;
for(i=; i<NN; ++i){
if(!v[i]) p[++num]=i;
for(j=; j<=num && i*p[j]<NN; ++j){
v[i*p[j]]=true;
if(i%p[j]==) break;
}
}
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie();
makePrime();
int t;
scanf("%d",&t);
while(t--){
int n;
scanf("%d",&n);
LL ans=;
for(int i=; i<=num; ++i){
for(LL t=p[i]; t<=n; t*=p[i]){
if((n+)%t!=)
ans=ans*p[i]%mod;
}
}
printf("%lld\n",ans);
}
return ;
}

LCM性质 + 组合数 - HDU 5407 CRB and Candies的更多相关文章

  1. 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][ ...

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

    CRB and Candies Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)T ...

  3. 2015 Multi-University Training Contest 10 hdu 5407 CRB and Candies

    CRB and Candies Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)T ...

  4. HDU 5407 CRB and Candies(LCM +最大素因子求逆元)

    [题目链接]pid=5407">click here~~ [题目大意]求LCM(Cn0,Cn1,Cn2....Cnn)%MOD 的值 [思路]来图更直观: 这个究竟是怎样推出的.说实话 ...

  5. hdu 5407 CRB and Candies(组合数+最小公倍数+素数表+逆元)2015 Multi-University Training Contest 10

    题意: 输入n,求c(n,0)到c(n,n)的所有组合数的最小公倍数. 输入: 首行输入整数t,表示共有t组测试样例. 每组测试样例包含一个正整数n(1<=n<=1e6). 输出: 输出结 ...

  6. HDU 5407 CRB and Candies

    题意:给一个正整数k,求lcm((k, 0), (k, 1), ..., (k, k)) 解法:在oeis上查了这个序列,得知答案即为lcm(1, 2, ..., k + 1) / (k + 1),而 ...

  7. 数论 HDOJ 5407 CRB and Candies

    题目传送门 题意:求LCM (C(N,0),C(N,1),...,C(N,N)),LCM是最小公倍数的意思,C函数是组合数. 分析:先上出题人的解题报告 好吧,数论一点都不懂,只明白f (n + 1) ...

  8. HDU 5407(2015多校10)-CRB and Candies(组合数最小公倍数+乘法逆元)

    题目地址:pid=5407">HDU 5407 题意:CRB有n颗不同的糖果,如今他要吃掉k颗(0<=k<=n),问k取0~n的方案数的最小公倍数是多少. 思路:首先做这道 ...

  9. CRB and Candies LCM 性质

    题目 CRB and Candies 题意 \[ \text{给定正整数N,求} LCM \lbrace C \left(N , 0 \right),C\left(N , 1 \right),..., ...

随机推荐

  1. 一起学微软Power BI系列-使用技巧(3)Power BI安卓手机版安装与体验

    Power BI有手机版,目前支持安卓,苹果和WP,不过没有WP手机,苹果在国内还不能用,要FQ和用就不测试了.安卓的我也也是费了九牛二虎之力才把app下载下来,把方法分享给大家. FQ太麻烦,所以建 ...

  2. 协议森林16 小美的桌号(DHCP协议)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 转载请先与我联系. DHCP协议用于动态的配置电脑的网络相关参数,如主机的IP地址,路由器出口地址.DNS域名服务器地 ...

  3. MFC中成员变量的声明顺序与析构顺序

    第一次用博客,第一篇随笔,就写今天遇到的一个问题吧. 在VS2008的MFC对话框程序,窗口成员变量的声明顺序与其析构顺序相反,即,先声明的变量后析构,后声明的变量先析构.未在其他模式下测试. cla ...

  4. JAVA回调机制解析

    一.回调机制概述     回调机制在JAVA代码中一直遇到,但之前不懂其原理,几乎都是绕着走.俗话说做不愿意做的事情叫做突破,故诞生了该文章,算是新年的新气象,新突破!     回调机制是什么?其实回 ...

  5. BZOJ 4453: cys就是要拿英魂![后缀数组 ST表 单调栈类似物]

    4453: cys就是要拿英魂! Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 90  Solved: 46[Submit][Status][Discu ...

  6. ENode简介与各种教学视频资源汇总(要进群这篇文章必看)

    ENode是什么 ENode是一个.NET平台开源的应用开发框架,为开发人员提供了一套完整的基于DDD+CQRS+ES+(in-memory)+EDA架构风格的解决方案. ENode的特色是什么 解决 ...

  7. 检验你的前端基础——Sit the test

    前端小学生向大家推荐一个网站:Sit the test.如果你是一名前端工程师或者立志于此,不妨试试此网站上面的测验题. 发现 十几天前,我在奇舞周刊的一篇文章中,发现了一个国外的技能测试网站:Sit ...

  8. mvc4 自定义HtmlHelper

    好久没写博客了,最近只看博客不写的习惯很不好啊. 好了,最近的项目中大量的用到了表单,很多表单有特殊的编写,但是在该项目中又有很多重复的地方,这个时候若能封装成htmlhelper将大大降低工作量的. ...

  9. 免费的精品: Productivity Power Tools 动画演示

    Productivity Power Tools 是微软官方推出的 Visual Studio 扩展,被用以提高开发人员生产率.它的出现一定程度上弥补和完善了 Visual Studio 自身的不足, ...

  10. Entity Framework 6 Recipes 2nd Edition(11-12)译 -> 定义内置函数

    11-12. 定义内置函数 问题 想要定义一个在eSQL 和LINQ 查询里使用的内置函数. 解决方案 我们要在数据库中使用IsNull 函数,但是EF没有为eSQL 或LINQ发布这个函数. 假设我 ...