比赛 20120806 评测结果 AAAAAWAWAA
题目名称 符文之语 最终得分 80
用户昵称 TBK 运行时间 0.117 s
代码语言 C++ 内存使用 0.32 MiB
提交时间 2012-08-06 11:41:04
显示代码纯文本
#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <string>
#include <cstring>
#include <cmath>
#include <vector>
#include <set>
#include <algorithm>
using namespace std;
string str;
int a,b,c,d,l,m,n,r[1001],k[4]={51,0,-1,0},t,x,y,z;
void meiju0(void)
{
	for (d=0;d<b;d++) 
	{
		t+=((str[d]-'0')*r[b-d-1])%a;
		t%=a;
	}
	if (t<k[0]) k[0]=t;
	if (t>k[2]) k[2]=t;
}
void meiju1(void)
{
	for (l=1;l<b;l++)
	{
		t=0;
		x=0;
		for (d=0;d<l;d++) 
		{
			t+=((str[d]-'0')*r[l-d-1])%a;
			t%=a;
		}
		for (d=l;d<b;d++)
		{
			x+=((str[d]-'0')*r[b-d-1])%a;
			x%=a;
		}
		t*=x;
		t%=a;
		if (t<k[0]) 
		{
			k[0]=t;
			k[1]=1;
		}
		if (t>k[2]) 
		{
			k[2]=t;
			k[3]=1;
		}
	}
	
}
void meiju2(void)
{
	for (l=1;l<b;l++)
		for (m=l+1;m<b;m++)
		{
			t=0;
			x=0;
			y=0;
			for (d=0;d<l;d++) 
			{
				t+=((str[d]-'0')*r[l-d-1])%a;
				t%=a;
			}
			for (d=l;d<m;d++)
			{
				x+=((str[d]-'0')*r[m-d-1])%a;
				x%=a;
			}
			for (d=m;d<b;d++)
			{
				y+=((str[d]-'0')*r[b-d-1])%a;
				y%=a;
			}
			t*=x;
			t%=a;
			t*=y;
			t%=a;
			if (t<k[0]) 
			{
				k[0]=t;
				k[1]=2;
			}
			if (t>k[2]) 
			{
				k[2]=t;
				k[3]=2;
			}
		}
}
void meiju3(void)
{
	
	for (l=1;l<b;l++)
		for (m=l+1;m<b;m++)
			for (n=m+1;n<b;n++)
			{
				t=0;
				x=0;
				y=0;
				z=0;
				for (d=0;d<l;d++) 
				{
					t+=((str[d]-'0')*r[l-d-1])%a;
					t%=a;
				}
				for (d=l;d<m;d++)
				{
					x+=((str[d]-'0')*r[m-d-1])%a;
					x%=a;
				}
				for (d=m;d<n;d++)
				{
					y+=((str[d]-'0')*r[n-d-1])%a;
					y%=a;
				}
				for (d=n;d<b;d++)
				{
					z+=((str[d]-'0')*r[b-n-1])%a;
					z%=a;
				}
				t*=x;
				t%=a;
				t*=y;
				t%=a;
				t*=z;
				t%=a;
				if (t<k[0]) 
				{
					k[0]=t;
					k[1]=3;
				}
				if (t>k[2]) 
				{
					k[2]=t;
					k[3]=3;
				}
			}
	
}
int main(void)
{
	freopen("chars.in","r",stdin);
	freopen("chars.out","w",stdout);
	cin>>str;
	cin>>a;
	b=str.length();
	r[0]=1;
	r[1]=10%a;
	for (c=2;c<b;c++) r[c]=(r[c-1]*r[1])%a;
	if (b<=50) 
	{
		meiju0();
		meiju1();
		if ((k[0]==0)&&(k[2]==a-1))
		{
			printf("%d %d %d %d",k[0],k[1],k[2],k[3]);
			return 0;
		}
		meiju2();
		if ((k[0]==0)&&(k[2]==a-1)) 
		{
			printf("%d %d %d %d",k[0],k[1],k[2],k[3]);
			return 0;
		}
		meiju3();
		printf("%d %d %d %d",k[0],k[1],k[2],k[3]);
	}
		else 
		{
			meiju0();
			meiju1();
			if ((k[0]==0)&&(k[2]==a-1)) printf("%d %d %d %d",k[0],k[1],k[2],k[3]);
				else
				{
					if (k[0]!=0) printf("%d %d ",0,2);
						else printf("%d %d ",0,k[1]);
					if (k[2]!=a-1) printf("%d %d",a-1,2);
						else printf("%d %d",a-1,k[3]);
				}
		}
	fclose(stdin);
	fclose(stdout);
	return 0;
}