题意:

输入n,求c(n,0)到c(n,n)的所有组合数的最小公倍数。

输入:

首行输入整数t,表示共有t组测试样例。

每组测试样例包含一个正整数n(1<=n<=1e6)。

输出:

输出结果(mod 1e9+7)。

感觉蛮变态的,从比赛开始我就是写的这道题,比赛结束还是没写出来……

期间找到了逆元,最小公倍数,组合数的各种公式,但是爆了一下午tle。

比赛结束,题解告诉我,公式秒杀法……

但是公式看不懂,幸好有群巨解说,所以有些听懂了,但还是需要继续思考才能弄懂。

题解:

设ans[i]表示i的所有组合数的最小公倍数。

设f[i]表示从1到i的正整数的最小公倍数。

然后获得从f[i]到ans[i]的公式——ans[i] = f[i+1]/i。                anss[i-1] = (f[i]*inv[i])%Mod;

然后获得求f[i]的公式——

  if(i == p^k) f[i] = f[i-1]*p;

  else f[i] = f[i-1];

接下来需要做的就是找到那些i == p^k了。

解题步骤:

1. 打素数表;

2. 由素数表寻找i == p^k;

3. f[1] = 1,打f[]数组表和ans[]数组表;

4. 输入数据;

5. 根据输入数据和ans[]表输出答案。

我认为还有其他方法,因为ac的程序的运行时间从15ms到900+ms都有。更多方法持续寻找中。

我的(根据题解的)代码——

 #include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std; #define LL long long
const int N = ;
const int Mod = ; int n, t;
LL ans, mid;
LL inv[N];
LL anss[N];
bool su2[N];
int su[N], su1[N];
LL f[N]; //f[i]表示1~i的最小公倍数 void table()
{
inv[] = ;
for(int i = ; i < N; i++) //求i的逆元
{
inv[i] = inv[Mod%i]*(Mod-Mod/i) % Mod;
} memset(su2, , sizeof(su2));
memset(su1, , sizeof(su1));
su2[] = su2[] = ; //求N以内的素数
su2[] = ;
for(int i = ; i < N; i++) su2[i] = i% == ? : ;
for(int i = ; i <= sqrt(N*1.0); i++)
{
if(su2[i])
{
for(int j = i*i; j <= N; j += *i)
{
su2[j] = ;
}
}
}
int k = ;
for(int i = ; i < N; i++) //打N以内的素数表
{
if(su2[i] == ) su[k++] = i;
}
for(int i = ; i < k; i++) //寻找满足p^k的数,其中p为素数,k为正整数
{
LL mid = su[i];
while(mid < N)
{
su1[mid] = su[i];
mid *= su[i];
}
}
f[] = ; //打N以内的1~i的最小公倍数表
for(int i = ; i < N; i++)
{
if(su1[i]) f[i] = f[i-]*su1[i];
else f[i] = f[i-];
f[i] %= Mod;
anss[i-] = (f[i]*inv[i])%Mod; //答案表
}
} int main()
{
//freopen("test.in", "r", stdin);
//freopen("test.out", "r", stdout);
table();
scanf("%d", &t);
while(t--)
{
scanf("%d", &n);
printf("%I64d\n", anss[n]);
}
return ;
}

hdu 5407 CRB and Candies(组合数+最小公倍数+素数表+逆元)2015 Multi-University Training Contest 10的更多相关文章

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

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

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

  3. 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(2015多校10)-CRB and Candies(组合数最小公倍数+乘法逆元)

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

  5. 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 ...

  6. LCM性质 + 组合数 - HDU 5407 CRB and Candies

    CRB and Candies Problem's Link Mean: 给定一个数n,求LCM(C(n,0),C(n,1),C(n,2)...C(n,n))的值,(n<=1e6). analy ...

  7. HDU 5407 CRB and Candies

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

  8. hdu 5416 CRB and Tree(2015 Multi-University Training Contest 10)

    CRB and Tree                                                             Time Limit: 8000/4000 MS (J ...

  9. 2015 Multi-University Training Contest 10 hdu 5406 CRB and Apple

    CRB and Apple Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)To ...

随机推荐

  1. C# 静态类

    静态类是不能实例化的,我们直接使用它的属性与方法,静态类最大的特点就是共享. 探究 public static class StaticTestClass { ; public static void ...

  2. ZOJ 3261 Connections in Galaxy War(逆向并查集)

    参考链接: http://www.cppblog.com/yuan1028/archive/2011/02/13/139990.html http://blog.csdn.net/roney_win/ ...

  3. javascript-权威指南读书笔记(1)

    <script type="text/javascript"> //数组与object的关系 var obj = { name: "刘建伟", Ag ...

  4. POJ1789Truck History

    题意 : 说实话,题意我没看懂,后来让人给我讲的样例..... 4 aaaaaaa baaaaaa abaaaaa aabaaaa 0 这个样例的话,就是输入n下面n行,每行7个字母,让你依次选两行进 ...

  5. hdu 1709 The Balance

    母函数的特殊情况,左右两边都可以放,如样例1,2,9 母函数为(1+x+1/x)*(1+x^2+1/x^2)*(1+x^9+1/x^9) 化简为(1+x+x^2)*(1+x^2+x^4)*(1+x^9 ...

  6. cojs 香蕉 解题报告

    啦啦啦,今天的考试题 不过原来考试题的n<=10w 由于我有更好的做法,所以我就改成20亿辣 本来先说一说考试题的正解做法的 但是复杂度是O(nlogm),实在是太渣了 所以还是说一说我的做法吧 ...

  7. Java的登陆验证问题

    java中的登陆验证问题可以有多种方式进行验证,通过拦截器功能完成,可以通过过滤器功能完成,也可以简单的代码在JSP页面中单独完成,其中都 涉及到一个关键的验证步骤,这个验证原理ASP,PHP,JAV ...

  8. 百度网盘,前几天刚从百度云改名过来,百度云这个名字给之前的百度开放云(同步盘用户比较小众)good

    作者:黑郁金香链接:http://www.zhihu.com/question/51803053/answer/127562835来源:知乎著作权归作者所有,转载请联系作者获得授权. 在8月网盘大面积 ...

  9. C++:虚函数的引入

    5.4虚函数5.4.1 虚函数的引入 //例5.19 虚函数的引例 #include<iostream> using namespace std; class MyBase{ //声明基类 ...

  10. 基于Struts2框架实现登录案例 之 使用Struts2标签库简化表单+继承ActionSupport完成输入交验

    一,使用Struts2标签库简化表单 在文章[基于Struts2框架实现登录案例]的基础上,通过使用Struts标签库可以简化登录页面login2.jsp <%@ page language=& ...