链接

点击跳转

题解

分析之后,发现这个题主要是解决这个问题:

∑ i = 1 n i k \sum_{i=1}^n i^k i=1∑n​ik

根据某些数学上的结论,这个东西是一个包含 n n n的最高次项为 k + 1 k+1 k+1次项的多项式

所以可以拉格朗日插值

预处理一些东西,复杂度能够做到 O ( k l o g k ) O(klogk) O(klogk)

如果不嫌麻烦写个线性筛的话,复杂度还能做到 O ( k ) O(k) O(k)

代码

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define iinf 0x3f3f3f3f
#define linf (1ll<<60)
#define eps 1e-8
#define maxn 1000010
#define maxe 1000010
#define cl(x) memset(x,0,sizeof(x))
#define rep(i,a,b) for(i=a;i<=b;i++)
#define drep(i,a,b) for(i=a;i>=b;i--)
#define em(x) emplace(x)
#define emb(x) emplace_back(x)
#define emf(x) emplace_front(x)
#define fi first
#define se second
#define de(x) cerr<<#x<<" = "<<x<<endl
using namespace std;
using namespace __gnu_pbds;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
ll read(ll x=0)
{ll c, f(1);for(c=getchar();!isdigit(c);c=getchar())if(c=='-')f=-f;for(;isdigit(c);c=getchar())x=x*10+c-0x30;return f*x;
}
struct EasyMath
{ll prime[maxn], phi[maxn], mu[maxn], fact[maxn];bool mark[maxn];ll fastpow(ll a, ll b, ll c){ll t(a%c), ans(1ll);for(;b;b>>=1,t=t*t%c)if(b&1)ans=ans*t%c;return ans;}void exgcd(ll a, ll b, ll &x, ll &y){if(!b){x=1,y=0;return;}ll xx, yy;exgcd(b,a%b,xx,yy);x=yy, y=xx-a/b*yy;}ll inv(ll x, ll p)  //p是素数{return fastpow(x%p,p-2,p);}ll inv2(ll a, ll p){ll x, y;exgcd(a,p,x,y);return (x+p)%p;}void shai(ll N){ll i, j;for(i=2;i<=N;i++)mark[i]=false;*prime=0;phi[1]=mu[1]=1;for(i=2;i<=N;i++){if(!mark[i])prime[++*prime]=i, mu[i]=-1, phi[i]=i-1;for(j=1;j<=*prime and i*prime[j]<=N;j++){mark[i*prime[j]]=true;if(i%prime[j]==0){phi[i*prime[j]]=phi[i]*prime[j];break;}mu[i*prime[j]]=-mu[i];phi[i*prime[j]]=phi[i]*(prime[j]-1);}}}ll CRT(vector<ll> a, vector<ll> m) //要求模数两两互质{ll M=1, ans=0, n=a.size(), i;for(i=0;i<n;i++)M*=m[i];for(i=0;i<n;i++)(ans+=a[i]*(M/m[i])%M*inv2(M/m[i],m[i]))%=M;return ans;}
}em;
#define mod 1000000007ll
struct Sum_of_powers_of_natural_numbers  //求\sum_{i=1}^n i^k
{ll _fact[maxn], inv[maxn], y[maxn], pref[maxn], suf[maxn];ll calc(ll n, ll k){ll i, ans=0, m=k+1;n%=mod;inv[1]=1; rep(i,2,m)inv[i]=inv[mod%i]*(mod-mod/i)%mod;_fact[0]=1; rep(i,1,m)_fact[i]=_fact[i-1]*inv[i]%mod;rep(i,1,m)y[i]=(em.fastpow(i,k,mod)+y[i-1])%mod;//求yi可以用线性筛减少一个logpref[0]=n, suf[m+1]=1;rep(i,1,m)pref[i]=pref[i-1]*(n-i)%mod;drep(i,m,1)suf[i]=suf[i+1]*(n-i)%mod;rep(i,1,m){ll t=pref[i-1]*suf[i+1]%mod;(t*=_fact[i]*_fact[m-i]%mod)%=mod;if(m-i&1)t=-t;(ans+=t*y[i]%mod)%=mod;}return ans;}
}spnn;
int main()
{ll n, m, i, j, k, ans, T=read();while(T--){ans=0;vector<ll> v1, v2;n=read(), m=read();rep(i,1,m){ll p=read();v1.emb(p); v2.emb(p+1);}sort(v1.begin(),v1.end());v1.erase(unique(v1.begin(),v1.end()),v1.end());v2.emb(1);sort(v2.begin(),v2.end());v2.erase(unique(v2.begin(),v2.end()),v2.end());if(v2.back()>n)v2.pop_back();k=v2.size();for(auto now:v2){(ans+=spnn.calc(n-now+1,k))%=mod;for(auto x:v1)if(x>=now)(ans-=em.fastpow(x-now+1,k,mod))%=mod;}printf("%lld\n",(ans+mod)%mod);}return 0;
}

洛谷P4593 [TJOI2018]教科书般的亵渎相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. 【BZOJ5339】【TJOI2018】教科书般的亵渎

    [题目链接] 点击打开链接 [思路要点] 模拟题目中的过程,我们本质上需要回答\(O(M^2)\)个形如求\(\sum_{i=L}^{R}i^{M+1}\)的询问. 拉格朗日插值即可. 时间复杂度\( ...

最新文章

  1. 2022-2028年中国绝缘栅双极晶体管(IGBT)行业投资分析及前景预测报告
  2. 让我们带着感恩的心生活
  3. sed和awk中使用shell变量
  4. 【jQuery 区别】.click()和$(document).on(click,指定的元素,function(){});的区别
  5. Cordova 本地项目创建方法
  6. 【网络编程】之八、异步选择WSAAsyncSelect
  7. 计算机房消防知识培训,通信机房消防知识培训课件.ppt
  8. Citrix Provisioning Services:Windows 10 VDA计算机的登录性
  9. js使用工具将表单封装成json字符串传到后台,js截取字符串(学生笔记)
  10. ubuntu系统显卡、显卡驱动、CUDA、CUDNN的介绍以及版本匹配问题
  11. Citrix,微软,VMware:它们的优缺点(资料整理汇集)
  12. Windows Server 2008 R2 主域控制器委派DNS到子域控控制器
  13. oracle转类型sql,[转]SQL Server 和Oracle 数据类型对应
  14. python垃圾邮件识别_垃圾邮件过滤器 python简单实现
  15. Java for Android 基础API整理
  16. c语言赋值语句逗号,C++中赋值运算符与逗号运算符的用法详解
  17. python读取word内容复制粘贴_如何复制word文档的内容?
  18. 希尔伯特(Hilbert)变换
  19. 最适合深夜失眠听的歌,听了最容易入睡的歌曲推荐
  20. 水果超市配送小程序的功能

热门文章

  1. M0R1系列模块烧写简介
  2. DJ系列接插件命名规则 以及和TE接插件对应关系
  3. CBTC系统标准: 1474.1---系统性能及功能需求
  4. weblogic11g清理缓存tmp
  5. 传智播客自学笔记第9天(待编辑)
  6. 英特尔实感SDK 代码示例
  7. 打造东湾“北拓东进”纵深科技创新走廊探讨‖ 2019大亚湾论坛
  8. 【北邮国院大三上】互联网协议_Internet Protocol_PART B
  9. NY8A053E 例程 之 PWM Ouput
  10. NY8A051F 6 I/O 8-bit EPROM-Based MCU 台湾九齐单片机