题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=5339
题面
思路
观察一下可知k=m+1k=m+1k=m+1
将aia_iai​从小到大排个序,再加上一个a0=0a_0=0a0​=0那么我们需要计算m+1m+1m+1次,每次计算仍在场上的怪物血量的k次方之和,那么最终答案就是∑i=0m(∑j=ai+1n−ai(j−ai)k−∑j=i+1m(aj−ai)k)\sum_{i=0}^m(\sum_{j={a_i+1}}^{n-a_i}(j-a_i)^k-\sum_{j=i+1}^m(a_j-a_i)^k)∑i=0m​(∑j=ai​+1n−ai​​(j−ai​)k−∑j=i+1m​(aj​−ai​)k)再取个模
由拉格朗日插值法(这里百度百科)
我们令f(n)=∑j=1njkf(n)=\sum_{j={1}}^{n}j^kf(n)=∑j=1n​jk那么我们只需取k+1k+1k+1个点x0=0,x1=1……xk=kx_0=0,x_1=1……x_k=kx0​=0,x1​=1……xk​=k分别计算出f(1),f(2)……f(k)f(1),f(2)……f(k)f(1),f(2)……f(k)。那么就有f(n)=(n−x1)(n−x2)……(n−xk)(x0−x1)(x0−x2)……(x0−xk)y0+(n−x0)(n−x2)……(n−xk)(x1−x0)(x1−x2)……(x1−xk)y1+……(n−x0)(n−x1)……(n−xk−1)(xk−x0)(xk−x1)……(xk−xk−1)ykf(n)=\frac{(n-x_1)(n-x_2)……(n-x_k)}{(x_0-x_1)(x_0-x_2)……(x_0-x_k)}y_0+\frac{(n-x_0)(n-x_2)……(n-x_k)}{(x_1-x_0)(x_1-x_2)……(x_1-x_k)}y_1+……\frac{(n-x_0)(n-x_1)……(n-x_{k-1})}{(x_k-x_0)(x_k-x_1)……(x_k-x_{k-1})}y_kf(n)=(x0​−x1​)(x0​−x2​)……(x0​−xk​)(n−x1​)(n−x2​)……(n−xk​)​y0​+(x1​−x0​)(x1​−x2​)……(x1​−xk​)(n−x0​)(n−x2​)……(n−xk​)​y1​+……(xk​−x0​)(xk​−x1​)……(xk​−xk−1​)(n−x0​)(n−x1​)……(n−xk−1​)​yk​考虑到除法不太好算,我们需要对分母求逆元(费马小定理相关)if(sum>0)x[i]=fast_pow(sum,MOD-2);else x[i]=-fast_pow(-sum,MOD-2);

然后暴力算(对于后面需要减去的部分暴力枚举算)即可。单次计算的时间复杂度是O(k2)O(k^2)O(k2)
总计时间复杂度O(k3)O(k^3)O(k3)

AC代码

#include<stdio.h>
#include<map>
#include<queue>
#include<iostream>
#include<algorithm>
#include<vector>
#include<stack>
#include<stdlib.h>
#include<string.h>
#define MOD 1000000007
typedef long long LL;
using namespace std;
int t;
LL n,m,ans;
LL cz[100];
LL x[100],y[100];
long long fast_pow(long long target,long long p);
void pre()
{LL te=m+2;LL sum=0;for(LL i=1;i<=te;i++){sum+=fast_pow(i,m+1);sum%=MOD;y[i]=sum;}for(LL i=1;i<=te;i++){sum=1;for(LL j=0;j<=te;j++) if(j!=i){sum*=(i-j);if(sum>MOD)sum%=MOD;else if(-sum>MOD)sum=-(-sum%MOD);}if(sum>0)x[i]=fast_pow(sum,MOD-2);else x[i]=-fast_pow(-sum,MOD-2);//记录每个分母的逆元}
}
LL calc(LL now)
{LL te=m+2;LL sum,cot=0;for(LL i=1;i<=te;i++){sum=1;for(LL j=0;j<=te;j++)if(j!=i){sum*=(n-cz[now]-j);sum%=MOD;}sum*=y[i];sum%=MOD;sum*=x[i];if(sum>0)sum%=MOD;else sum=-(-sum%MOD);cot+=sum;}for(LL i=now+1;i<=m;i++)cot-=fast_pow(cz[i]-cz[now] ,m+1);if(cot<0)cot+=(((-cot)/MOD+1)*MOD);cot%=MOD;return cot;
}
int main()
{scanf("%d",&t);while(t--){ans=0;scanf("%lld%lld",&n,&m);for(LL i=1;i<=m;i++) scanf("%lld",&cz[i]);sort(cz+1,cz+m+1);pre();//预处理求每个对应的y以及每个分母的逆元(显然分母不变)for(LL i=0;i<=m;i++)ans+=calc(i);//计算每次的值,累加ans%=MOD; printf("%lld\n",ans);}return 0;
}
long long fast_pow(long long target,long long p)
{long long a[50];a[1]=target;for(int i=2;i<50;i++){a[i]=a[i-1]*a[i-1];a[i]%=MOD;}long long ans=1;for(int i=1;p;i++){if(p%2) ans=(ans*a[i])%MOD;p/=2;}return ans;
}

[BZOJ 5339] 教科书般的亵渎相关推荐

  1. 【ybt金牌导航8-3-3】【luogu P4593】分数计算 / 教科书般的亵渎(数学)(拉格朗日插值)

    分数计算 / 教科书般的亵渎 题目链接:ybt金牌导航8-3-3 / luogu P4593 题目大意 有一些怪,血量从 1~n,其中有 m 个数是没有怪的,给出这些数. 然后你可以每次操作攻击所有怪 ...

  2. 教科书般的亵渎(dfs)

    题面: 教科书般的亵渎 Time Limit: 1500MS Memory Limit: 65536K Total Submissions: 36 Accepted: 3 Description &q ...

  3. NOI模拟(5.23) TJOID2T3 教科书般的亵渎 (bzoj5339)

    教科书般的亵渎 题目背景: 5.23 模拟 TJOI2018D2T3 分析:拉格朗日差值 这个题的题意怕不是有毒,注意他每一次的k是相同的,为总共要用多少次卡片,然后卡片是每次先将所有的数减一,如果这 ...

  4. A - 【深蓝】教科书般的亵渎 (Gym - 102072A )(矩阵快速幂+计算斐波那契数列)

    "现在给大家展示一波教科书般的亵渎" "扭了扭了" 炉石传说是一款比较火的卡牌游戏,不同的卡牌间可以打出许多不可思议的配合. 炉石传说的战斗大部分由随从来完成. ...

  5. bzoj 5339 [TJOI2018]教科书般的亵渎 拉格朗日插值

    题面 题目传送门 解法 可以发现,题目可以转化成求若干个形如\(\sum_{i=1}^ni^k\)的东西 这个东西可以拉格朗日插值 大概讲一下拉格朗日插值是个什么东西: 显然,\(\sum_{i=1} ...

  6. P4593-[TJOI2018]教科书般的亵渎【拉格朗日差值】

    正题 题目链接:https://www.luogu.com.cn/problem/P4593 题目大意 场上有若干只怪,最高的为nnn,每个怪血量不同,有mmm个血量不存在. 不停释放亵渎(全场打一, ...

  7. P4593 [TJOI2018]教科书般的亵渎(拉格朗日插值 + k幂次之和)

    洛谷题目链接 题目大意:有点绕,有 n−mn - mn−m 个怪兽,它们的血量在 [1,n][1,n][1,n] 值域上且每个怪兽的血量都不同 (其中 m 个点被挖掉),你每使用一次亵渎会给所有怪兽血 ...

  8. BZOJ5339: [TJOI2018]教科书般的亵渎-组合数学

    传送门 题意: 在炉石传说中有这样的一个场面:n个随从,血量为1~n,现在去除m个随从,然后开始释放"亵渎".每使用一张"亵渎"会获得一定的分数,分数计算如下: ...

  9. 洛谷P4593 [TJOI2018]教科书般的亵渎(拉格朗日插值)

    题意 题目链接 Sol 打出暴力不难发现时间复杂度的瓶颈在于求\(\sum_{i = 1}^n i^k\) 老祖宗告诉我们,这东西是个\(k\)次多项式,插一插就行了 上面的是\(O(Tk^2)\)的 ...

  10. 洛谷P4593 [TJOI2018]教科书般的亵渎

    链接 点击跳转 题解 分析之后,发现这个题主要是解决这个问题: 求 ∑ i = 1 n i k \sum_{i=1}^n i^k i=1∑n​ik 根据某些数学上的结论,这个东西是一个包含 n n n ...

最新文章

  1. 数据结构与算法——并查集(不相交集合)
  2. 函数式接口作为方法的返回值类型案例
  3. 《小马哥Spring Cloud系列》十五:分布式应用追踪-视频笔记
  4. html语言简单,简单的html语言计算器
  5. layui 渲染select下拉选项 ,日期控件的用法
  6. easy connect 获取服务端配置信息失败_如何统计 Mysql 服务器状态信息?
  7. C++ 用遗传算法解决TSP问题,旅行商问题
  8. 手把手教你搭建Nginx-rtmp流媒体服务器+使用ffmpeg推流
  9. IT职场人生系列之十六:入职(新手篇)
  10. ios 中NSString的一些调用
  11. Router_Cloud
  12. centos7.x 网卡自动关闭,总是需要手动去启动情况解决方法
  13. 数据库系统原理课程设计
  14. 神通数据库连接Oracle的Dblink
  15. java 加权平均_使用Java 8流计算加权平均值
  16. 年轻人转行需三思,未来5-10年什么工作真吃香?
  17. C语言小项目实践——日历程序
  18. 《计算之魂》思考题4.3
  19. JS对象中添加新的属性及修改字段名
  20. 原神私服搭建教程 (最新版)

热门文章

  1. Fedora9下codeblocks安装无法编译的问题
  2. AD使用技巧 内附AD18下载地址
  3. bat脚本获取管理员权限
  4. Android得到位图方式
  5. 计算机取证程序论文,计算机取证论文参考文献推荐 计算机取证论文参考文献哪里找...
  6. 复现贪吃蛇程序——玩家控制小蛇的移动(第三部分)
  7. 将element-china-area-data获取的地区编码转为文字存储
  8. json例外被抛出并且未接住
  9. 一款JAVA微信小程序商城源码,带完整后台【运行版】
  10. Delphi 操作Excel方法大全