【51nod】2590 持续讨伐

挣扎着卡了卡常过了

记\(dp[i][j]\)为到第\(i\)位,和第\(i\)位相连的部分长度\(x^{j}\)乘上之前部分所有方案\(x^{K}\)总和

转移用二项式定理展开即可,若这位不选,可以有\(dp[i + 1][j] = dp[i][K]\)

矩阵乘法优化一下,卡常用预处理出2的几次幂的矩阵的答案

#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define space putchar(' ')
#define enter putchar('\n')
#define eps 1e-10
#define ba 47
#define MAXN 2005
//#define ivorysi
using namespace std;
typedef long long int64;
typedef unsigned int u32;
typedef double db;
template<class T>
void read(T &res) {
res = 0;T f = 1;char c = getchar();
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 +c - '0';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) {x = -x;putchar('-');}
if(x >= 10) {
out(x / 10);
}
putchar('0' + x % 10);
}
const int MOD = 998244353;
int N,M,K;
int C[15][15];
bool vis[55];
int inc(int a,int b) {
return a + b >= MOD ? a + b - MOD : a + b;
}
int mul(int a,int b) {
return 1LL * a * b % MOD;
}
void update(int &x,int y) {
x = inc(x,y);
}
struct Matrix {
int f[9][9];
Matrix() {memset(f,0,sizeof(f));}
friend Matrix operator * (const Matrix &a,const Matrix &b) {
Matrix c;
for(int i = 0 ; i <= K ; ++i) {
for(int j = 0 ; j <= K ; ++j) {
for(int h = 0 ; h <= K ; ++h) {
update(c.f[i][j],mul(a.f[i][h],b.f[h][j]));
}
}
}
return c;
}
void unit() {
for(int i = 0 ; i <= K ; ++i) f[i][i] = 1;
}
friend Matrix fpow(Matrix a,int c) {
Matrix res,t = a;res.unit();
while(c) {
if(c & 1) res = res * t;
t = t * t;
c >>= 1;
}
return res;
}
}A,B,ans,P[35];
void Solve() {
read(N);read(M);read(K);
for(int i = 0 ; i <= K ; ++i) {
C[i][0] = 1;
for(int j = 1 ; j <= i ; ++j) {
C[i][j] = inc(C[i - 1][j - 1],C[i - 1][j]);
}
}
for(int i = 0 ; i <= K ; ++i) {
for(int j = 0 ; j <= i ; ++j) {
update(A.f[j][i],C[i][j]);
}
} B = A;
for(int i = 0 ; i <= K ; ++i) update(B.f[K][i],1);
P[0] = B;
for(int i = 1 ; i <= 30 ; ++i) P[i] = P[i - 1] * P[i - 1];
int p = 1,t;
ans.unit();
for(int i = 1 ; i <= M ; ++i) {
read(t);
for(int j = 0 ; j <= 29 ; ++j) {
if((t - p) >> j & 1) ans = ans * P[j];
}
p = t;
ans = ans * A;++p;
}
if(p != N) {
for(int j = 0 ; j <= 29 ; ++j) {
if((N - p) >> j & 1) ans = ans * P[j];
}
}
int res = 0;
for(int i = 0 ; i <= K ; ++i) {
update(res,ans.f[i][K]);
}
out(res);enter;
}
int main(){
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Solve();
return 0;
}

【51nod】2590 持续讨伐的更多相关文章

  1. 51nod 2589 快速讨伐

    51nod 如果不考虑升级操作,只有买装备操作和打怪操作,那么首先一定要先买装备,然后可以打死1级的怪,这些怪被打死的时间只要在第一次买装备后面好了,因为现在总操作是\(n+\sum a_i\)个,所 ...

  2. 【51nod】2589 快速讨伐

    51nod 2589 快速讨伐 又是一道倒着推改变世界的题... 从后往前考虑,设\(dp[i][j]\)表示还有\(i\)个1和\(j\)个\(2\)没有填,那么填一个1的话直接转移过来 \(dp[ ...

  3. 【51nod】2591 最终讨伐

    [51nod]2591 最终讨伐 敲51nod是啥评测机啊,好几次都编译超时然后同一份代码莫名奇妙在众多0ms中忽然超时 这道题很简单就是\(M\)名既被诅咒也有石头的人,要么就把石头给没有石头被诅咒 ...

  4. 51nod 1640 MST+二分

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1640 1640 天气晴朗的魔法 题目来源: 原创 基准时间限制:1 秒 ...

  5. 51Nod - 1640 天气晴朗的魔法 大+小生成树(最大值最小)/二分

    天气晴朗的魔法 这样阴沉的天气持续下去,我们不免担心起他的健康.   51nod魔法学校近日开展了主题为“天气晴朗”的魔法交流活动.   N名魔法师按阵法站好,之后选取N - 1条魔法链将所有魔法师的 ...

  6. 51nod 1640 天气晴朗的魔法

    题目来源: 原创 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 这样阴沉的天气持续下去,我们不免担心起他的健康.   51nod魔法学校近日开展了主题为“天气晴朗 ...

  7. 51nod 1785 数据流中的算法 (方差计算公式)

    1785 数据流中的算法 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 20 难度:3级算法题   51nod近日上线了用户满意度检测工具,使用高级人工智能算法,通过用户访问时间.鼠 ...

  8. Travis CI用来持续集成你的项目

    这里持续集成基于GitHub搭建的博客为项目 工具: zqz@ubuntu:~$ node --version v4.2.6 zqz@ubuntu:~$ git --version git versi ...

  9. SQL Server 常用内置函数(built-in)持续整理

    本文用于收集在运维中经常使用的系统内置函数,持续整理中 一,常用Metadata函数 1,查看数据库的ID和Name db_id(‘DB Name’),db_name('DB ID') 2,查看对象的 ...

随机推荐

  1. BSGS ! x

    一.引入: 若存在一个式子a^b ≡ c (mod p) (p ≡ 1000000007,且0<a,b,c<p) 已知a,b,求c.  这不就是快速幂嘛! 已知a,c,求b. 这就是我们需 ...

  2. 文件对比工具 Beyond Compare 4.2.9中文破解版for win 附通用注册码

    链接: https://pan.baidu.com/s/1yYxPo8nNv0PuOA1ZC9-F1w 提取码: v76g 注册码: --- BEGIN LICENSE KEY --- H1bJTd2 ...

  3. linux java -jar

    常见命令1 nohup java -jar /xxx/xxx/xxx.jar >/dev/>& & 分析各个指令代表什么意思: >,重写文件,如果文件里面有内容会覆盖 ...

  4. Servlet容器:Jetty和tomcat的比较

    相同点: Tomcat和Jetty都是一种Servlet引擎,他们都支持标准的servlet规范和JavaEE的规范.不同点: 架构比较Jetty的架构比Tomcat的更为简单Jetty的架构是基于H ...

  5. Linux操作系统load average过高,kworker占用较多cpu

    Linux操作系统load average过高,kworker占用较多cpu 今天巡检发现,mc1的K8S服务器集群有些异常,负载不太均衡.其中10.2.75.32-34,49的load averag ...

  6. Java中路径相关的获取方式

    [参考文章]:Java文件路径(getResource) [参考文章]:关于java:如何获取正在运行的JAR文件的路径? [参考文章]:关于Class.getResource和ClassLoader ...

  7. 攻防世界Hello,CTF writeup

    解题过程 首先在ida中进行反汇编,查看main函数的代码: 代码的的36行处进行了一个字符串比较,如果v10的值等于v13的值会反馈一个success的输出.v13的值在第15行给出,因此需要知道v ...

  8. Ubuntu JDK环境变量

    环境变量配置 sudo gedit ~/.bashrc export JAVA_HOME=/usr/local/java/jdk1.8.0_201 export JRE_HOME=${JAVA_HOM ...

  9. VUE -- Identifier 'n_type' is not in camel case

    Identifier 'n_type' is not in camel case 参数名的 `_` 去掉就好了

  10. Airbnb新用户的民宿预定结果预测

    1. 背景 关于这个数据集,在这个挑战中,您将获得一个用户列表以及他们的人口统计数据.web会话记录和一些汇总统计信息.您被要求预测新用户的第一个预订目的地将是哪个国家.这个数据集中的所有用户都来自美 ...