【HDOJ 5407】 CRB and Candies (大犇推导

pid=5407">【HDOJ 5407】 CRB and Candies

赛后看这题题解仅仅有满眼的迷茫………………

g(N) = LCM(C(N,0),C(N,1),...,C(N,N))

f(n) =\ LCM(1, 2, ..., n)f(n) = LCM(1,2,...,n),
the fact g(n) =\ f(n+1) / (n+1)g(n) = f(n+1)/(n+1)

f(n)\ =\ LCM(1, 2, ..., n)f(1)
= 1

If n =p^{k}n =p?k?? then f(n) =\ f(n-1) \times \ pf(n) = f(n?1)× p,
else f(n) =\ f(n-1)f(n) = f(n?1).

和不断的woc…… 后来QAQ巨找到了推导的文章。

。。

恩……贴上来……

http://www.zhihu.com/question/34859879

感觉我有公式恐惧症。。

看到长串公式就犯晕= = 巨巨们研究研究吧…………

感觉依据题解能做出来已经非常好了

事实上这题另一点是要取余 因为须要取余 不能做除法 因此要求个分母的乘法逆元 刚好在攻数论的扩欧,扩欧小费马都能做 前一篇有扩欧的不错的帖子链接 有兴趣的能够去瞅瞅

本题代码例如以下:

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;
#define sz 1000000
#define ll long long
const int mod = 1e9+7;

int p[sz+1];
ll f[sz+1];

bool ok(ll x)
{
    int t = p[x];
    while(x%t == 0 && x > 1) x /= t;
    return x == 1;
}

void Init()
{
    int i,j;
    for(i = 1; i <= sz; ++i) p[i] = i;
    for(i = 2; i <= sz; ++i)
        if(p[i] == i)
            for(j = i+i; j <= sz; j += i)
                if(p[j] == j) p[j] = i;

    f[0] = 1;
    for(i = 1; i <= sz; ++i)
    {
        if(ok(i)) f[i] = f[i-1]*p[i]%mod;
        else f[i] = f[i-1];
    }
}
//扩欧
//int e_gcd(int a,int b,int &x,int &y)
//{
//    if(!b)
//    {
//        x = 1;
//        y = 0;
//        return a;
//    }
//    ll tmp = x,ans = e_gcd(b,a%b,x,y);
//    tmp = x;
//    x = y;
//    y = tmp - a/b*y;
//    return ans;
//}

ll pow(ll a,int m)
{
    ll ans = 1;
    for(;m; m >>= 1, a= a*a%mod)
        if(m&1) ans = ans*a%mod;
    return ans;
}

ll cal(int a,int m)
{
//扩欧
//    int x,y;
//    int gcd = e_gcd(a,m,x,y);
//    return (x/gcd+m)%m;
//小费马
    return pow(a,m-2);
}

int main()
{
    Init();
    int t,n;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        printf("%lld\n",f[n+1]*cal(n+1,mod)%mod);
    }
    return 0;
}
时间: 2024-10-13 21:53:30

【HDOJ 5407】 CRB and Candies (大犇推导的相关文章

数论 HDOJ 5407 CRB and Candies

题目传送门 题意:求LCM (C(N,0),C(N,1),...,C(N,N)),LCM是最小公倍数的意思,C函数是组合数. 分析:先上出题人的解题报告 好吧,数论一点都不懂,只明白f (n + 1)意思是前n+1个数的最小公倍数,求法解释参考HDOJ 1019,2028 这个结论暂时不知道怎么推出来的,那么就是剩下1/(n+1) 逆元的求法了 代码: /************************************************ * Author :Running_Time

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(素数筛选法,除法取模(乘法逆元))

题目链接: 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

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

[题目链接]click here~~ [题目大意]求LCM(Cn0,Cn1,Cn2....Cnn)%MOD 的值 [思路]来图更直观: 这个究竟是怎样推出的,说实话.本人数学归纳大法没有推出来,幸得一个大神给定愿文具体证明,点击这里:click here~~ 代码: #include <bits/stdc++.h> using namespace std; const int N=1e6+10; const int MOD=1e9+7; typedef long long LL; LL p[N

【LCM从1-n】 HDU 5407 CRB and Candies

通道 题意:计算C(n,0)+...C(n,n) 思路:转化为LCM(1...n)/ n 代码: #include <cstdio> #include <bitset> using namespace std; typedef long long ll; const int N = 1000000+2; const ll MOD = (ll)1e9 + 7; ll vis[(N+31)/32 + 5]; int pri[5770000], pnum; ll sum[5770000]

HDU 5407 CRB and Candies

传送门 http://oeis.org/A002944 http://oeis.org/A003418 令an=LCM(C(n,0),C(n,1),C(n,2),...,C(n,n)) bn=LCM(1,2,3,...,n) an=bn+1n+1 if (n=pk)bn=p?bn?1elsebn=bn?1 #include <bits/stdc++.h> using namespace std; #define prt(k) cerr<<#k" = "<&

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 (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恰