P4593 [TJOI2018]教科书般的亵渎(拉格朗日插值)
Posted zhangbuang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P4593 [TJOI2018]教科书般的亵渎(拉格朗日插值)相关的知识,希望对你有一定的参考价值。
题目描述
小豆喜欢玩游戏,现在他在玩一个游戏遇到这样的场面,每个怪的血量为aia_iai?,且每个怪物血量均不相同,小豆手里有无限张“亵渎”。亵渎的效果是对所有的怪造成111点伤害,如果有怪死亡,则再次施放该法术。我们认为血量为000怪物死亡。
小豆使用一张 “亵渎”会获得一定的分数,分数计算如下,在使用一张“亵渎”之后,每一个被亵渎造成伤害的怪会产生xkx^kxk,其中xxx是造成伤害前怪的血量为xxx和需要杀死所有怪物所需的“亵渎”的张数kkk。
输入输出格式
输入格式:第一行输入一个TTT(T≤10T\leq10T≤10),表示有多少组测试数据
每组组测试数据第一行为nnn,mmm,表示有当前怪物最高的血量nnn,和mmm种没有出现的血量
接下来mmm行,每行111个数aia_iai?,表示场上没有血量为aia_iai?的怪物
输出格式:一共TTT行,每行一个数, 第iii行表示第iii组测试数据中小豆的最后可以获得的分数, 因为这个分数会很大需要模109+710^9+7109+7
输入输出样例
说明
对于10%10\%10%的数据,有m=0m=0m=0
对于20%20\%20%的数据,有m≤1m\leq1m≤1
对于30%30\%30%的数据,有m≤2m\leq2m≤2
对于40%40\%40%的数据,有m≤3m\leq3m≤3
对于50%50\%50%的数据,有m≤4m\leq4m≤4
对于60%60\%60%的数据,有m≤5m\leq5m≤5
对于100%100\%100%的数据,有m≤50m\leq50m≤50
对于100%100\%100%的数据,有n≤1013n\leq10^13n≤1013。
出题的是个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\n",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\n",ans); 50 51 return 0; 52
以上是关于P4593 [TJOI2018]教科书般的亵渎(拉格朗日插值)的主要内容,如果未能解决你的问题,请参考以下文章
P4593 [TJOI2018]教科书般的亵渎(拉格朗日插值)