zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    echo和重定向
    grep命令
    重温JSP学习笔记--JSP动作标签
    重温JSP学习笔记--El表达式
    重温JSP学习笔记--El函数库
    重温JSP学习笔记--JSTL标签库
    重温JSP学习笔记
    Android 用 camera2 API 自定义相机
    从零开始用 Flask 搭建一个网站(一)
    从零开始用 Flask 搭建一个网站(二)
  • 原文地址:https://www.cnblogs.com/saionjisekai/p/9838758.html
Copyright © 2011-2022 走看看