为防止广告,目前nocow只有登录用户能够创建新页面。如要创建页面请先登录/注册(新用户需要等待1个小时才能正常使用该功能)。

Sgu/197

来自NOCOW
< Sgu
跳转到: 导航, 搜索
#include <cstdio>
#include <cstdlib>
#include <cstring>
 
using namespace std ;
 
const int POW[4]= {1, 10, 100, 1000}, E[6]= {1, 1<<1, 1<<2, 1<<3, 1<<4, 1<<5}; 
const int MaxSize= 1 << 5;	
 
char Str[150];
int N[30], M, MOD;
int MtxBase[MaxSize][MaxSize], MtxAns[MaxSize][MaxSize], MtxTmp[MaxSize][MaxSize];
bool Skip;
 
inline int Check(int a, int b)
{
	for(int i(1); i< M; ++ i)
		if(((a & E[i])>0) == ((a & E[i - 1])>0) && 
		   ((b & E[i])>0) == ((b & E[i - 1])>0) && 
		   ((a & E[i])>0) == ((b & E[i])>0))return 0;
	return 1;
}
 
inline int Div()
{
	int Rem= 0; 
	for(int i(N[0]); i > 0; -- i)
	{
		Rem*= 10000; Rem+= N[i];
		N[i]= Rem >> 1; Rem &= 1;
	}
	for(;N[N[0]] == 0 && N[0] > 0; -- N[0]);
	return Rem;
}
 
int main()
{
	freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout);
	scanf("%s%d%d", Str, &M, &MOD);
	for(int i(strlen(Str) - 1), cache(0); i >= 0; -- i, ++cache)
	{
		if(cache % 4 == 0)++N[0];
		N[N[0]]+= (Str[i]-'0') * POW[cache % 4];
	}
	--N[1];
	for(int i(1); i<= N[0]; ++ i)if(N[i] < 0){N[i]= 9999; --N[i+1];}else break;
	if(N[N[0]]==0)-- N[0];
	if(N[0]==0)Skip= 1;
 
	if(M == 1){MtxBase[0][0]= 1; MtxBase[1][1]= 1;}else
	for(int i(0); i< E[M]; ++ i)
		for(int j(0); j< E[M]; ++ j)
			MtxBase[i][j]= Check(i, j);
 
	bool Flag= 0;
	for(; N[0];)
	{
		if(Div())
		{
			if(!Flag)
			{
				for(int i(0); i< E[M]; ++ i)for(int j(0); j< E[M]; ++ j)MtxAns[i][j]= MtxBase[i][j];
				Flag= 1;
			}else
			{
				for(int i(0); i< E[M]; ++ i)for(int j(0); j< E[M]; ++ j)MtxTmp[i][j]= 0;
				for(int i(0); i< E[M]; ++ i)for(int j(0); j< E[M]; ++ j)for(int k(0); k< E[M]; ++ k)
					MtxTmp[i][j]+= MtxAns[i][k] * MtxBase[k][j], MtxTmp[i][j] %= MOD;
				for(int i(0); i< E[M]; ++ i)for(int j(0); j< E[M]; ++ j)MtxAns[i][j]= MtxTmp[i][j];
			}/*
			//Only for debug
			for(int i(0); i< E[M]; ++ i)
			{
				for(int j(0); j< E[M]; ++ j)printf("%d ", MtxAns[i][j]);
				printf("\n");
			}
			printf("\n");*/
		}
 
		for(int i(0); i< E[M]; ++ i)for(int j(0); j< E[M]; ++ j)MtxTmp[i][j]= 0;
		for(int i(0); i< E[M]; ++ i)for(int j(0); j< E[M]; ++ j)for(int k(0); k< E[M]; ++ k)
			MtxTmp[i][j]+= MtxBase[i][k] * MtxBase[k][j], MtxTmp[i][j] %= MOD;
		for(int i(0); i< E[M]; ++ i)for(int j(0); j< E[M]; ++ j)MtxBase[i][j]= MtxTmp[i][j];
	}
 
	int Ans= 0; 
	if(Skip)
		{Ans= 1;for(int i(0); i< M; ++ i)Ans *= 2, Ans %= MOD;}
	else
		for(int i(0); i< E[M]; ++ i)for(int j(0); j< E[M]; ++ j)Ans+= MtxAns[i][j], Ans%= MOD ;
	printf("%d\n", Ans);
	return 0 ;
}
/by Logic
#include<stdio.h>
#include<string.h>
const int maxd=150,maxp=400,maxb=40;
int n[maxd]={0},m,p,d,ar,ans=0;
int po[maxp][maxb][maxb]={0},f[maxb][maxb]={0};
bool judg(int a,int b)
{
	int i,x=a&b,y=a|b;
	for(i=1;i<m;i++,x>>=1,y>>=1)
		if((x&3)==3||((y^3)&3)==3) return 0;
	return 1;
}
void mul(int mul1[][maxb],int mul2[][maxb],int pro[][maxb])
{
	int i,j,k,res[maxb][maxb]={0};
	for(i=0;i<ar;i++)
		for(j=0;j<ar;j++)
			for(k=0;k<ar;k++)
				res[i][j]+=mul1[i][k]*mul2[k][j],res[i][j]%=p;
	memcpy(pro,res,sizeof(po[0]));
}
void dec(int num[])
{
	int i;
	num[0]--;
	for(i=0;i<maxd-1&&num[i]<0;i++) 
		num[i+1]--,num[i]+=10; 
}
void div(int num[])
{
	int i;
	for(i=0;i<maxd-1;i++)
		num[i]=num[i]/2+(num[i+1]&1)*5;
}
int main()
{
#ifndef ONLINE_JUDGE
	freopen("data.in","r",stdin);
	//freopen("data.out","w",stdout);
#endif
	int i,j;
	char n0[maxd];
	scanf("%s %d %d\n",n0,&m,&p);
	ar=1<<m;
	d=strlen(n0);
	for(i=0;i<d;i++)
		n[i]=n0[d-i-1]-'0';
	for(i=0;i<ar;f[i][0]=1,i++)
		for(j=0;j<ar;j++)
			po[0][i][j]=judg(i,j);
	dec(n);
	for(i=1;i<maxp;i++)
	{
		if(n[0]&1) mul(po[i-1],f,f);
		div(n);
		mul(po[i-1],po[i-1],po[i]);
	}
	//for(i=0;i<ar;i++) { for(j=0;j<ar;j++) printf("%d ",f[i][j]); printf("\n");} printf("\n");
	for(i=0;i<ar;i++)
		ans+=f[i][0],ans%=p;
	printf("%d\n",ans);
	return 0;
}
个人工具