HDU6333 莫队+组合数

题目大意:

给定n m

在n个数中最多选择m个的所有方案

#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define LL long long
const int mod=1e9+7;
const int N=1e5+5;

/********组合数模板*********/
LL pow_mod(LL a, LL b) {
    LL res = 1LL; a %= mod;
    while(b){
        if(b & 1) res = res * a % mod;
        a = a * a % mod;
        b >>= 1;
    } return res;
}
LL inv(LL a) { return pow_mod(a, mod-2); }
LL F[N], Finv[N];//F是阶乘,Finv是逆元的阶乘
void init() {
    F[0] = Finv[0] = 1LL;
    for(int i = 1; i < N; i ++){
        F[i] = F[i-1] * 1LL * (LL)i % mod;
        Finv[i] = Finv[i-1] * 1LL * inv(i) % mod;
    }
} // O(n)预处理
LL C(LL n, LL m) {
    if(m < 0 || m > n) return 0;
    return F[n] * 1LL * Finv[n - m] % mod * Finv[m] % mod;
} // O(1)获得组合数C(n,m)
/**************************/

LL res[N];

/********莫队*********/
int len;
struct Q {
    LL n,m;
    int block, id;
    bool operator <(const Q& q)const {
        if(block==q.block) return n<q.n;
        return block<q.block;
    }
}q[N];
void Mo(int t) {
    LL L=0, R=0, ans=1LL;
    for(int i=0;i<t;i++) {
        LL l=q[i].n, r=q[i].m;
        while(L>l) ans=((ans+C(L-1LL,R))%mod*Finv[2])%mod, L--;
        while(L<l) ans=(2*ans%mod-C(L,R)+mod)%mod, L++;
        while(R<r) ans=(ans+C(L,R+1))%mod, R++;
        while(R>r) ans=(ans-C(L,R)+mod)%mod, R--;
        res[q[i].id]=ans;
    }
}
/**************************/

int main()
{
    init(); len=sqrt(N);
    int t; scanf("%d",&t);
    for(int i=0;i<t;i++) {
        scanf("%lld%lld",&q[i].n,&q[i].m);
        q[i].block=q[i].m/len; q[i].id=i;
    }
    sort(q,q+t);
    Mo( t);
    for(int i=0;i<t;i++)
        printf("%lld\n",res[i]);

    return 0;
}

原文地址:https://www.cnblogs.com/shuaihui520/p/10323143.html

时间: 2024-10-17 03:03:42

HDU6333 莫队+组合数的相关文章

HDU 6333 莫队+组合数

Problem B. Harvest of Apples Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 2397    Accepted Submission(s): 934 Problem Description There are n apples on a tree, numbered from 1 to n.Count th

HDU-6333 Problem B. Harvest of Apples 莫队

HDU-6333 题意:有n个不同的苹果,你最多可以拿m个,问有多少种取法,多组数据,组数和n,m都是1e5,所以打表也打不了. 思路:这道题要用到组合数的性质,记S(n,m)为从n中最多取m个的方法总数,显然是C(n,0),C(n,1)……C(n,m)的和. 显然S(n,m+1) = S(n, m) + C(n,m+1); 还有一个等式就不那么明显了,S(n+1,m) = 2 * S(n,m) - C(n,m); 我也是在王神犇的指导下明白的. 既然知道了一组(n,m)是可以在很快的时间下转移

清橙A1206 小Z的袜子(莫队算法)

A1206. 小Z的袜子 时间限制:1.0s   内存限制:512.0MB 总提交次数:744   AC次数:210   平均分:44.44 将本题分享到: 查看未格式化的试题   提交   试题讨论 试题来源 2010中国国家集训队命题答辩 问题描述 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命-- 具体来说,小Z把这N只袜子从1到N编号,然后从编号L到R(L 尽管小Z并不在意两只袜子是不是

莫队算法及其应用

在写这篇博客之前,我最想做的一件事就是:ORZ莫队%%%%%%%%. 说明:ceil(x)表示x向上取整,sqrt(x)表示对x开算数平方根. 一.莫队算法简介 莫队算法是一种暴力算法,真的很暴力,但速度很快,属于速度快的暴力.它的基本思想就是分块.关于分块的介绍建议参考hzwer的博客,然后%%%%hzw.莫队算法主要用于解决一类离线查询的问题,和线段树处理的问题是一样的,但处理的是两个不同的方面,当由[L,R]转移到[L',R']的时间为O(|L'-L|+|R'-R|)时适宜使用莫队算法.这

bzoj2038: [2009国家集训队]小Z的袜子(hose) [莫队]

Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命……具体来说,小Z把这N只袜子从1到N编号,然后从编号L到R(L 尽管小Z并不在意两只袜子是不是完整的一双,甚至不在意两只袜子是否一左一右,他却很在意袜子的颜色,毕竟穿两只不同色的袜子会很尴尬.你的任务便是告诉小Z,他有多大的概率抽到两只颜色相同的袜子.当然,小Z希望这个概率尽量高,所以他可能会询问多个(L,R)以方便自己选择

BZOJ 2038: [2009国家集训队]小Z的袜子(hose) ( 莫队 )

莫队..先按sqrt(n)分块, 然后按块的顺序对询问排序, 同块就按右端点排序. 然后就按排序后的顺序暴力求解即可. 时间复杂度O(n1.5) ------------------------------------------------------------------------------ #include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 50009; int N,

bzoj 2038 [2009国家集训队]小Z的袜子(hose) 莫队算法

2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 10239  Solved: 4659[Submit][Status][Discuss] Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命--具体来说,小Z把这N只袜子从1到N编号,然后从编号L到R(L 尽管小Z并不在意两

BZOJ 2038: [2009国家集训队]小Z的袜子(hose)【莫队算法裸题&amp;&amp;学习笔记】

2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 9894  Solved: 4561[Submit][Status][Discuss] Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命…… 具体来说,小Z把这N只袜子从1到N编号,然后从编号L到R(L 尽管小Z并不在意两

BZOJ 2038: [2009国家集训队]小Z的袜子(hose) [莫队算法]【学习笔记】

2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 7687  Solved: 3516[Submit][Status][Discuss] Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命……具体来说,小Z把这N只袜子从1到N编号,然后从编号L到R(L 尽管小Z并不在意两只