首页 > 其他分享 >洛谷 P3193 [HNOI2008]GT考试

洛谷 P3193 [HNOI2008]GT考试

时间:2022-09-29 01:33:05浏览次数:83  
标签:tmp typedef GT 洛谷 int rep long HNOI2008 define

原题链接

dp+矩阵加速
明天再来写

#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;

#define fr first
#define se second
#define et0 exit(0);
#define rep(i, a, b) for(int i = (int)(a); i <= (int)(b); i ++)
#define rrep(i, a, b) for(int i = (int)(a); i >= (int)(b); i --)
#define IO ios::sync_with_stdio(false),cin.tie(0);

typedef long long LL;
typedef pair<int, int> PII;
typedef pair<LL, LL> PLL;
typedef unsigned long long ULL;

const int INF = 0X3f3f3f3f, N = 21;
const double eps = 1e-7, pi = acos(-1);

int n, m, MOD;

int ne[N];

string s;

void mul(int c[][N], int a[][N], int b[][N]) {
    int tmp[N][N] = {0};
    rep (i, 0, N - 1) 
        rep (j, 0, N - 1) 
            rep (k, 0, N - 1) 
                tmp[i][j] = (tmp[i][j] + 1ll * a[i][k] * b[k][j]) % MOD;

    memcpy(c, tmp, sizeof tmp);
}

void work() {
	cin >> n >> m >> MOD >> s;
	s = '*' + s;
	
	ne[0] = ne[1] = 0;
	for (int i = 2, j = 0; i <= m; i++) {
	    while (j && s[j + 1] != s[i]) j = ne[j];
	    if (s[j + 1] == s[i]) j++;
	    ne[i] = j;
	}
	
	int f1[N][N] = {0};
	f1[0][0] = 1;
	int a1[N][N] = {0};
	
	rep (i, 0, m - 1) {
		for (char c = '0'; c <= '9'; c++) {
			int u = i;
			while (u && s[u + 1] != c) u = ne[u];
			if (s[u + 1] == c) u++;
			a1[i][u] += 1;
		}
	}
	
	while (n) {
		if (n & 1) mul(f1, f1, a1);
		mul(a1, a1, a1);
		n >>= 1;
	}
	
	int res = 0;
	rep (i, 0, m - 1) res = ((LL)res + f1[0][i]) % MOD;
	cout << res << endl; 
}	

signed main() {
	IO

	int test = 1;

	while (test--) {
		work();
	}

	return 0;
}

标签:tmp,typedef,GT,洛谷,int,rep,long,HNOI2008,define
From: https://www.cnblogs.com/xhy666/p/16740112.html

相关文章

  • GTK入门学习:信号与回调函数
    前面我们学习的GTK界面都是静态的,我们按下按钮它是没有响应的,如何让它有响应呢?接下来我们一起学习GTK的信号与回调函数。GTK采用了信号与回调函数来处理窗口外部传来的事件......
  • GTK进阶学习:键盘事件
    键盘事件,可以理解为操作键盘的动作。对于窗口而言,用户操作键盘,窗口检测到键盘的操作(产生一个信号),然后去做相应处理(调用其规定的回调函数),即可认为是键盘事件,还是信号......
  • Go语言图形界面开发:Go版GTK
    初识GTK​​01、GUI概述​​​​02、GTK简介​​​​03、环境搭建(windows)​​Go语言快速入门​​04、Go入门教程​​HelloGTK​​05、一个简单的空白窗口​​​​06、控......
  • C语言也能做界面:踏上GTK+学习之旅
    ​​00、背上行囊1——程序员学习之道​​​​01、背上行囊2——为什么要学习GTK​​​​02、背上行囊3——​​​​GUI概述​​​​03、背上行囊4——GTK简介​​​​04、......
  • GTK入门学习:glade的环境搭建
    1)Linux环境搭建在线安装即可,安装命令如下:测试是否安装成功,在终端敲glade即可:2)windows版本环境搭建下载一个windows版本双击后一直“下一步”安装即可。需要注意的是,如果......
  • GTK简单版计算器
    接下来我们做一个简单版的计算器。1)获取按钮上的内容。2)如果获取的内容是“c”,则代表进行退格操作,相当于删去最后一个字符。3)如果获取的内容不是“c”,则把每一次获取的......
  • GTK入门学习:布局练习之计算器
    接下来,我们做一个布局练习,如下图:我们用表格布局实现,表格布局参考坐标如下:这里我们用到行编辑控件(GtkEntry )。行编辑的创建:GtkWidget*gtk_entry_new(void);返回值:行编......
  • 为什么要学习GTK?
    开发图形界面的工具包有很多,windows有WPF、WinForm,Android有自带的SDK,IOS也有自己的一套,跨平台的话可以用Qt,结果发现,GTK真没它的用武之地。实际上,GTK的地位真是这样的,那我......
  • GTK入门学习:glade的介绍
    上面的学习中,我们是通过纯C语言代码来进行GTK编程的,这也是我们学习GTK的最佳方法,因为这样我们可以清楚地知道整个流程,大体流程如下:1)创建主窗口,根据需要设置窗口的相应属性2)......
  • GTK进阶学习:GTK实现截图功能( 可以指定截图范围 )
    按按钮截图,图片保存在当前路径为“save.png”:#include<gtk/gtk.h>#include<cairo.h>/********************************************************功能:指定窗口区域截图,需......