[TJOI2017]可乐(数据加强版)
矩阵乘法优化图上DP。
先要想出一个很巧妙的点。朴素的方程
会发现这个方程是高度重复的,每个点都会由前面的固定的一些点转移过来,于是就可以考虑进行矩阵乘法优化,用一个
#include<bits/stdc++.h>
//#define zczc
const int mod=2017;
const int N=110;
using namespace std;
inline void read(int &wh){
wh=0;int f=1;char w=getchar();
while(w<'0'||w>'9'){if(w=='-')f=-1;w=getchar();}
while(w<='9'&&w>='0'){wh=wh*10+w-'0';w=getchar();}
wh*=f;return;
}
int m,n,want;
struct node{
int a[N][N];
}newone,ss;
node operator *(node s1,node s2){
node an=newone;
for(int i=0;i<=m;i++){
for(int j=0;j<=m;j++){
for(int k=0;k<=m;k++){
an.a[i][j]+=s1.a[i][k]*s2.a[k][j];
an.a[i][j]%=mod;
}
}
}
return an;
}
node qpow(node s1,int s2){
if(s2==1)return s1;
node an=qpow(s1,s2>>1);
if(s2&1)return an*an*s1;
else return an*an;
}
signed main(){
#ifdef zczc
freopen("in.txt","r",stdin);
#endif
read(m);read(n);int s1,s2;
for(int i=0;i<=m;i++)ss.a[i][i]=ss.a[0][i]=1;
for(int i=1;i<=n;i++){
read(s1);read(s2);
ss.a[s1][s2]=ss.a[s2][s1]=1;
}
read(want);
node an=qpow(ss,want);
int ans=0;
for(int i=0;i<=m;i++)ans+=an.a[i][1];
printf("%d",ans%mod);
return 0;
}
一如既往,万事胜意
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!