10.23T3 杨辉三角上做莫队

#3848 EX 面筋棒

描述

与 jerryzhong 的决战在即,ljr 需要一件压场子的终极武器。 ljr 手上有 M 个面筋,能量值分别为 1-M 的整数。现在 ljr 想要利用这些面筋制作他的 终极武器:EX 面筋棒。EX 面筋棒是一种能够发射强大剑气的能量武器。它由一些面筋按 次序连接而成。EX 面筋棒可能会发射失败,ljr 无法承受失败的损失。在 SPW 财团的资助 下,经过上百次的实验,ljr 终于发现了面筋棒成功发射剑气的规律:

·ljr 臂力不行,拿不动太长的 EX 面筋棒,所以面筋棒的长度 L 不能大于 N,当然它的 长度不能为 0。

·每次发动攻击时,面筋棒会被触发 L 次,第 i 次触发会激活前 i 个面筋,进入蓄能状 态。

·对于第 i 次触发,首先剑气能量会聚集在已经激活的能量值最小的面筋上,然后能量 会自发地寻找更高的能量值,如果当前面筋棒中某一个面筋 x 的能量值 y 是大于当前剑气能 量的面筋中,最小的一个,那么剑气能量会转移到面筋 x 上,并提高至 y。如果 x 未被激活, 则 EX 面筋棒会由于能量溢出而发射失败。

·当发射能量达到当前已激活的面筋中的最大值,则第 i 次触发的能量聚集完成。 ·只有当 L 次触发的能量全部完成聚集,Ex 面筋棒才能成功发射剑气。

ljr 急切地想报复 jerryzhong,他想知道,利用他手上的面筋,能够制造出多少种不同的 可以成功发射剑气的 EX 面筋棒。两种面筋棒不同当且仅当他们的长度不同,或某一个位置 上面筋能量不同。由于方案数太大,你只需要告诉他答案除以 19260817 的余数。

由于能量自发地提高违反了物理定律,这导致了时空的崩塌,世界线之间的隔阂被打破。 这时,你眼前突然出现了 Q 个来自各自世界的 ljr,每个 ljr 都想知道方案总数,但是他们拥 有的面筋不一样,并且他们的牛(sao)逼程度也不一样。你需要帮助每一个世界的 ljr 算出 方案总数。

输入

第一行一个整数 Q,意义如题所述。

接下来 Q 行每行 2 个整数 M,N,意义如题所述。

输出

Q 行每行一个整数表示方案总数。

样例输入[复制]
1
4 4
样例输出[复制]
40
提示

将 EX 面筋棒看做数列,则下列不同的组成都是能够成功发射的:

长度为 1:{1},{2},{3},{4}

长度为 2 : {1 2},{1 3},{1 4},{2 1},{2 3},{2 4},{3 1},{3 2},{3 4},{4 1},{4 2},{4 3}

长度为 3: {1 2 3},{1 2 4},{1 3 4},{2 1 3},{2 1 4},{2 3 1},{2 3 4},{2 4 1},{3 1 4},{3 2 1},{3 2 4},{3 4 1},{3 4 2},{4 2 1},{4 3 1},{4 3 2}

长度为 4: {1 2 3 4},{2 1 3 4},{2 1 4 3},{2 3 1 4},{3 2 1 4},{3 2 4 1},{3 4 2 1},{4 3 2 1} 一共 40 种,所以你输出 40。 {2,1,3,4}的发射过程:

第 1 次触发,激活第 1 个面筋,能量所在的位置(下标):1。能量最终为 2 达到了已 激活面筋的最大能量值 2。

第 2 次触发,激活第 1,2 个面筋,能量转移方向:2->1。能量最终为 2,达到了已激活 面筋的最大能量值 2。

第 3 次触发,激活第 1,2,3 个面筋,能量转移方向:2->1->3。能量最终为 3,达到了已 激活面筋的最大能量值 3。

第 4 次触发,激活第 1,2,3,4 个面筋,能量转移方向:2->1->3->4。能量最终为 4,达到 了已激活面筋的最大能量值 4。

四次触发都完成了能量的聚集,所以该型号 EX 面筋棒能够成功发射。 {1,4,2,3}的发射失败过程:

第 1 次触发,激活第 1 个面筋,能量在 1,最终为 1,聚能成功。

第 2 次触发,只激活了第 1,2 个面筋。能量首先在 1,然后转移至 3。由于 3 未被激活, 能量溢出,发射失败。

后两次触发无论是否成功,该型号 EX 面筋棒都不能成功发射。

{1,2,3,4,5}不能成功发射,是因为 ljr 拿不动长度为 5 的面筋棒,且没有能量值为 5 的面筋。

数据范围与约定

对于 100%的数据,保证有 M>=N。

数据范围

numQ M N

1 ≤6 ≤6 ≤6

2 ≤10 ≤10 ≤10

3 ≤1 ≤1000 ≤1000

4 ≤2000 ≤2000 ≤2000

5 ≤4000 ≤4000 ≤4000

6 ≤5000 ≤5000 ≤5000

7 ≤100000 ≤100000 ≤100000

8 ≤100000 ≤100000 ≤100000

9 ≤100000 ≤100000 ≤100000

10 ≤100000 ≤100000 ≤100000

标签
ZYH
 
 
此题犯错误:Ans顺序写错,C要特判
code:
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #define N 100006
 5 using namespace std;
 6 struct node{
 7     long long m,n,id;
 8 }e[N];
 9 long long kuai[N];
10 const long long mod=19260817;
11 int siz=332;
12 bool cmp(const node&a,const node&b){
13     if(kuai[a.n]!=kuai[b.n])return a.n<b.n;
14     return kuai[a.n]&1?a.m<b.m:a.m>b.m;
15 }
16 long long ans[N];
17 long long ksm(long long a,long long b){
18     long long ans=1;
19     for(;b;b>>=1){
20         if(b&1){
21             ans*=a;
22             ans%=mod;
23         }
24         a*=a;
25         a%=mod;
26     }
27     return ans;
28 }
29 long long f[N],fac[N],inv[N];
30 void pre(){
31     fac[0]=1;
32     f[0]=1;
33     for(long long i=1;i<=100000;i++){
34         fac[i]=fac[i-1]*i%mod;
35         f[i]=f[i-1]*2%mod;
36     }
37     inv[100000]=ksm(fac[100000],mod-2);
38     for(long long i=99999;i>=0;i--){
39         inv[i]=inv[i+1]*(i+1)%mod;
40     }
41     for(int i=1;i<=1e5;i++)
42     kuai[i]=(i-1)/siz+1;
43 }
44 long long C(long long a,long long b){
45     if(a<b)return 0;
46     return fac[a]*inv[b]%mod*inv[a-b]%mod;
47 }
48 int main(){
49     pre();
50     long long Q;
51     cin>>Q;
52     for(long long i=1;i<=Q;i++){
53         cin>>e[i].m>>e[i].n;
54         e[i].id=i;
55     }
56     sort(e+1,e+Q+1,cmp);
57     long long l=1,r=0,Ans=0;
58     for(long long i=1;i<=Q;i++){
59         while(l<e[i].n)l++,Ans=(Ans+(f[l-1]*C(r,l)%mod)%mod)%mod;
60         while(l>e[i].n)Ans=(Ans-(f[l-1]*C(r,l))%mod+mod)%mod,l--;
61         while(r<e[i].m)Ans=(3*Ans-(f[l]*C(r,l))%mod+C(r,0)+mod)%mod,r++;
62         while(r>e[i].m)r--,Ans=((Ans+(f[l]*C(r,l))%mod-C(r,0))%mod)%mod*12840545%mod;
63         ans[e[i].id]=(Ans+mod)%mod;
64     }
65     for(long long i=1;i<=Q;i++){
66         cout<<ans[i]<<'
';
67     }
68     return 0;
69 }

over

原文地址:https://www.cnblogs.com/saionjisekai/p/9838758.html