HDU - 5145 NPY and girls

题目:有n个女生,每个女生都有一个教室,有m个询问[l,r],问你拜访该区间的女生的教室有多少种方案,对1e9+7取模

思路:num表示该教室的女生的人数,那么答案就是(r-l+1)!/(num1!*num2!....)

代码:

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define PI acos(-1.0)
#define LL long long
#define ULL unsigned long long
#define INF 0x3f3f3f3f
#define mm(a,b) memset(a,b,sizeof(a))
#define PP puts("*********************");
template T f_abs(T a){ return a > 0 ? a : -a; }
template T gcd(T a, T b){ return b ? gcd(b, a%b) : a; }
template T lcm(T a,T b){return a/gcd(a,b)*b;}
// 0x3f3f3f3f3f3f3f3f
// 0x3f3f3f3f

const LL MOD=1000000007;
const int maxn=3e4+50;
struct Ask{
    int L,R,id;
}ask[maxn];
LL ans[maxn];
int arr[maxn],num[maxn];//从1开始计数
int n,m,siz;//n个数,m个询问,块的大小
LL Inv[maxn],F[maxn];
bool cmp(Ask a,Ask b){
    if(a.L/siz!=b.L/siz) return a.L/sizask[i].R){
            temp=temp*(LL)num[arr[R]]%MOD;
            num[arr[R]]--;
            R--;
        }
        while(Lask[i].L){
            L--;
            num[arr[L]]++;
            temp=temp*Inv[num[arr[L]]]%MOD;
        }
        int x=ask[i].R-ask[i].L+1;
        ans[ask[i].id]=temp*F[x]%MOD;;
    }
}
int main(){

    int T;
    Inv[1]=1;
    F[0]=F[1]=1;
    for(int i=2;i


你可能感兴趣的:(组合数学,莫队算法)