题目链接

  一开始想到这可能能用矩阵优化,但以为暴力就能卡过……T成二十分

  首先我们回顾一下我们的暴力转移方程

  用f[i][j][0/1]表示在i时刻,j点,1不爆炸,0已爆炸的方案数,那么f[i][j][0]=f[i-1][j][0]+f[i-1][j][1],f[i][j][1]=f[i-1][j][1]+f[i-1][k][1](其中k表示与j相邻的点)。

  然后我们看f[i][j][1]=f[i-1][j][1]+f[i-1][k][1]这个式子

  如果设定j和j相连,就化简为f[i][j][1]=f[i-1][k][1]

  然后就可以用矩阵乘法啦

  考虑到f[i][j][0]的求法,发现这是一个关于f[i-1][j][1]的和

  而我们发现f[i-1][j][1]是一串矩阵等比数列

  于是应用等比数列求和公式

  

#include<algorithm>
#include<cstdio>
#include<cctype>
#include<cstdlib>
#include<cstring>
#define mod 2017 inline long long read(){
long long num=,f=;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-') f=-;
ch=getchar();
}
while(isdigit(ch)){
num=num*+ch-'';
ch=getchar();
}
return num*f;
} int n,m; struct Matrix{
long long s[][];
Matrix(){memset(s,,sizeof(s)); }
Matrix operator *(const Matrix &a){
Matrix ans;
for(int i=;i<=n;++i)
for(int j=;j<=n;++j)
for(int k=;k<=n;++k)
ans.s[i][j]=(ans.s[i][j]+(s[i][k]*a.s[k][j])%mod)%mod;
return ans;
}
Matrix operator +(const Matrix &a){
Matrix ans;
for(int i=;i<=n;++i)
for(int j=;j<=n;++j)
ans.s[i][j]=(s[i][j]+a.s[i][j])%mod;
return ans;
}
}; Matrix Pow(Matrix x,int p){
Matrix ans;
for(int i=;i<=n;++i) ans.s[i][i]=;
while(p){
if(p&) ans=ans*x;
x=x*x;
p>>=;
}
return ans;
} Matrix Sum(Matrix x,int p){
Matrix ans;
if(!p) return ans;
for(int i=;i<=n;++i) ans.s[i][i]=;
ans=ans+Pow(x,p>>); ans=ans*Sum(x,p>>);
if(p&) ans=ans+Pow(x,p);
return ans;
} int q[][];
Matrix Start;
int ans; int main(){
n=read(),m=read();
for(int i=;i<=m;++i){
int from=read(),to=read();
q[from][to]=q[to][from]=;
}
for(int i=;i<=n;++i) q[i][i]=;
for(int i=;i<=n;++i)
for(int j=;j<=n;++j) Start.s[i][j]=q[i][j];
int t=read();
Matrix now; now=Pow(Start,t);
for(int i=;i<=n;++i) ans=(ans+now.s[i][])%mod;
Matrix sum; sum=Sum(Start,t -);
for(int i=;i<=n;++i) sum.s[i][i]=(sum.s[i][i]+)%mod;
for(int i=;i<=n;++i) ans=(ans+sum.s[i][])%mod;
printf("%d",ans);
return ;
}

最新文章

  1. .NET轻量级MVC框架:Nancy入门教程(二)——Nancy和MVC的简单对比
  2. 利用Jquery给当前页或者跳转后页面的导航栏添加选中后样式
  3. SAX - DefaultHandler
  4. [HDU 1011] Starship Troopers
  5. SwingConsole
  6. Linux(Centos、Debian)之安装Java JDK及注意事项(转)
  7. HDU 4916 树形dp
  8. Zeppelin0.6.2使用hive解释器
  9. 关于java数据库章节connection连接不成功的时候!!!
  10. python的IndentationError: unexpected indent python
  11. sql中的 IF 条件语句的用法
  12. Linux安装python3.6
  13. Python实现将爱词霸每日一句定时推送至微信
  14. 什么是redis?redis有什么用途?
  15. [daily][centos][iptables][firewalld] firewalld的初步了解
  16. LeetCode 937 Reorder Log Files 解题报告
  17. java交互方式中的同步与异步
  18. [意识流]简单易懂的AC自动机
  19. 前端PHP入门-015-递归函数-飘过
  20. vscode debugger for chrome 调试webpack的配置问题

热门文章

  1. Scanner-String-StringBuilder-API
  2. sizeof()用法汇总 zhuan
  3. Android Studio 升级到3.0后出现编译错误\.gradle\caches\transforms-1\files-1.1\*****-release.aar
  4. 学习用5W1H来管理自己的项目/工作
  5. How to install Eclipse?
  6. PHP开发基础视频教程
  7. STL:string类中size()与length()的区别
  8. DirectX9(翻译):介绍
  9. PAT (Basic Level) Practise (中文)-1030. 完美数列(25)
  10. java在线聊天项目0.2版本 制作客户端窗体,使用swing(用户界面开发工具包)和awt(抽象窗口工具包) BorderLayout布局与GridLayout布局不同之处 JPanel设置大小