题面
给定一个长度为m的字符串s,给定一个不大于 1 0 18 10^{18} 1018的正整数n,询问:长度为n且不包含子串s的字符串有多少种。
题解
从已经匹配上的位数考虑,f[i][j]表示i位的字符串,已经匹配上了j位的方案数,那么只需要设计一个m*m的矩阵就可以快速幂了。构造矩阵的的过程可以用KMP来O(M)做,但是M很小,可以直接暴力O(M^4),我就直接打的暴力。
#include<bits/stdc++.h>
using namespace std;
namespace fastio{
template<typename tn> void read(tn &a){
tn x=0,f=1;char c=' ';
for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
for(;isdigit(c);c=getchar() ) x=x*10+c-'0';
a=x*f;
}
template<typename tn> void print(tn a){
if(a<0) putchar('-'