这题如果n不大的话显然是个状压dp,但n的范围是10^100...但m的范围很小,最大只有5,状态最多也就是2^5,所以可以根据m暴力构造出2^m * 2^m 的状态转移矩阵A,然后A^(n-1),统计结果矩阵中每个数的和就是答案了,但是n太大了,所以还要写个高精/2,和高精--...太烦了- -...另外当m==1的时候,直接求2^n就是答案...
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <string>
#include <cstring>
using namespace std;
const int maxn=10000+10;
const int N=11000;
int n,mod;
int m,p,q,tt;
int mat[50][50];
int a[10],b[10];
char num[1200];
int phi[11000];
struct Mat
{
int mat[50][50];
};
struct bnum
{
int dt[120];
void init(char* s,int len)
{
memset(dt,0,sizeof dt);
for (int i=len-1,j=1; i>=0; i--,j++)
dt[j]=s[i]-'0';
dt[0]=len;
dt[1]--;
for (int i=1; i<=dt[0]; i++)
if (dt[i]<0)
{