zoukankan      html  css  js  c++  java
  • P4593 [TJOI2018]教科书般的亵渎(拉格朗日插值)

    题目描述

    小豆喜欢玩游戏,现在他在玩一个游戏遇到这样的场面,每个怪的血量为aia_iai,且每个怪物血量均不相同,小豆手里有无限张“亵渎”。亵渎的效果是对所有的怪造成111点伤害,如果有怪死亡,则再次施放该法术。我们认为血量为000怪物死亡。

    小豆使用一张 “亵渎”会获得一定的分数,分数计算如下,在使用一张“亵渎”之后,每一个被亵渎造成伤害的怪会产生xkx^kxk,其中xxx是造成伤害前怪的血量为xxx和需要杀死所有怪物所需的“亵渎”的张数kkk。

    输入输出格式

    输入格式:

    第一行输入一个TTT(T≤10Tleq10T10),表示有多少组测试数据

    每组组测试数据第一行为nnn,mmm,表示有当前怪物最高的血量nnn,和mmm种没有出现的血量

    接下来mmm行,每行111个数aia_iai,表示场上没有血量为aia_iai的怪物

    输出格式:

    一共TTT行,每行一个数, 第iii行表示第iii组测试数据中小豆的最后可以获得的分数, 因为这个分数会很大需要模109+710^9+7109+7

    输入输出样例

    输入样例#1: 复制
    2
    10 1
    5
    4 2
    1
    2
    输出样例#1: 复制
    415
    135

    说明

    对于10%10\%10%的数据,有m=0m=0m=0

    对于20%20\%20%的数据,有m≤1mleq1m1

    对于30%30\%30%的数据,有m≤2mleq2m2

    对于40%40\%40%的数据,有m≤3mleq3m3

    对于50%50\%50%的数据,有m≤4mleq4m4

    对于60%60\%60%的数据,有m≤5mleq5m5

    对于100%100\%100%的数据,有m≤50mleq50m50

    对于100%100\%100%的数据,有n≤1013nleq10^{13}n1013。






    出题的是个sb,题意都说不清楚,醉了。

    这题的最后答案的柿子很好写,这里就不说,关键就是如何求自然数幂和,

    比如sigmg (i^(m))   这里是i的m次方,那和函数应该是一个m+1次的函数,那需要m+2点去

    确定这个多项式。

    然后若果x坐标是连续的,那可以先把所有的乘起来,在除以每一个对应的逆元,

    对于分母,可以预处理阶乘,

    特判一个分母的正负





    ‘’

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 #include<algorithm>
     5 #define max(a,b) ((a)>(b)?(a):(b))
     6 #define min(a,b) ((a)<(b)?(a):(b))
     7 #define LL long long
     8 #define re register
     9 #define maxn
    10 const LL mod=1e9+7;
    11 inline LL read() {
    12     LL x=0;char c=getchar();while(c<'0'||c>'9') c=getchar();
    13     while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();return x;
    14 }
    15 int T;
    16 LL n,m,fac[55],a[55];
    17 inline LL quick(LL a,LL b) {LL S=1;while(b) {if(b&1ll) S=S*a%mod;b>>=1ll;a=a*a%mod;}return S;}
    18 inline LL calc(LL n,int m) {
    19     if(n<=m+2) {
    20         LL ans=0;
    21         for(re int i=1;i<=n;i++) ans=(ans+quick(i,m)%mod)%mod;
    22         return ans;
    23     }
    24     LL ans=1,now=0,tot=0;
    25     for(re int i=1;i<=m+2;i++)
    26         ans=(ans*(n-i+mod)%mod)%mod;
    27     for(re int i=1;i<=m+2;i++) {
    28         now=now+quick(i,m);now%=mod;
    29         LL t=ans*quick((n-i+mod)%mod,mod-2)%mod,q=quick(fac[m+2-i]*fac[i-1]%mod,mod-2);
    30         if((m+2-i)&1) tot-=now*t%mod*q%mod;
    31             else tot+=now*t%mod*q%mod;
    32         tot+=mod;tot%=mod;
    33     }
    34     return tot;
    35 }
    36 int main() {
    37     T=read();fac[0]=1;
    38     for(re int i=1;i<=54;i++) fac[i]=(fac[i-1]*(LL)i)%mod;
    39     while(T--) {
    40         n=read(),m=read();
    41         for(re int i=1;i<=m;i++) a[i]=read();
    42         std::sort(a+1,a+m+1);
    43         LL ans=0;
    44         for(re int i=0;i<=m;i++) {
    45             ans+=calc(n-a[i],m+1);ans%=mod;
    46             for(re int j=i+1;j<=m;j++)
    47                 ans=(ans-quick(a[j]-a[i],m+1)%mod+mod)%mod;
    48         }
    49         printf("%lld
    ",ans);
    50     }
    51     return 0;
    52 }
     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 #include<algorithm>
     5 #define max(a,b) ((a)>(b)?(a):(b))
     6 #define min(a,b) ((a)<(b)?(a):(b))
     7 #define LL long long
     8 #define re register
     9 #define maxn
    10 const LL mod=1e9+7;
    11 inline LL read() {
    12     LL x=0;char c=getchar();while(c<'0'||c>'9') c=getchar();
    13     while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();return x;
    14 }
    15 int T;
    16 LL n,m,fac[55],a[55];
    17 inline LL quick(LL a,LL b) {LL S=1;while(b) {if(b&1ll) S=S*a%mod;b>>=1ll;a=a*a%mod;}return S;}
    18 inline LL calc(LL n,int m) {
    19     if(n<=m+2) {
    20         LL ans=0;
    21         for(re int i=1;i<=n;i++) ans=(ans+quick(i,m)%mod)%mod;
    22         return ans;
    23     }
    24     LL ans=1,now=0,tot=0;
    25     for(re int i=1;i<=m+2;i++)
    26         ans=(ans*(n-i+mod)%mod)%mod;
    27     for(re int i=1;i<=m+2;i++) {
    28         now=now+quick(i,m);now%=mod;
    29         LL t=ans*quick((n-i+mod)%mod,mod-2)%mod,q=quick(fac[m+2-i]*fac[i-1]%mod,mod-2);
    30         if((m+2-i)&1) tot-=now*t%mod*q%mod;
    31             else tot+=now*t%mod*q%mod;
    32         tot+=mod;tot%=mod;
    33     }
    34     return tot;
    35 }
    36 int main() {
    37     T=read();fac[0]=1;
    38     for(re int i=1;i<=54;i++) fac[i]=(fac[i-1]*(LL)i)%mod;
    39     while(T--) {
    40         n=read(),m=read();
    41         for(re int i=1;i<=m;i++) a[i]=read();
    42         std::sort(a+1,a+m+1);
    43         LL ans=0;
    44         for(re int i=0;i<=m;i++) {
    45             ans+=calc(n-a[i],m+1);ans%=mod;
    46             for(re int j=i+1;j<=m;j++)
    47                 ans=(ans-quick(a[j]-a[i],m+1)%mod+mod)%mod;
    48         }
    49         printf("%lld
    ",ans);
    50     }
    51     return 0;
    52 }
  • 相关阅读:
    防止特殊html字符的问题(xxs攻击)方法
    asp.net 服务器Button控件使用(onclick和onclientclick使用)
    Asp:Button控件onclick事件无刷新页面提示消息
    动态添加Marquee标签,并动态赋值与属性
    asp.net 前台通过Eval()绑定动态显示样式
    asp.net 中json字符串转换
    近况
    C# fixed语句固定变量详解
    fixed说明
    Net架构必备工具列表
  • 原文地址:https://www.cnblogs.com/zhangbuang/p/10976373.html
Copyright © 2011-2022 走看看