为什么前五个点满分,后五个点TLE?
查看原帖
为什么前五个点满分,后五个点TLE?
1032098
json_keven楼主2024/11/23 09:31

谁知道怎样特判后5个点?

代码:

#include<iostream>
using namespace std;

long long ckkp(long long n,long long i,long long p,long long *pa,long long *pb,int *pz)
{
	long long a=*pa;
	long long b=*pb;
	int z=*pz;
	if(i==-1)return 1;
	int _a=(n-i)%p;
	int _b=(i+1)%p;
	if(_a==0)
	{
		z++;
		_a=(n-i)/p;
		while(_a%p==0)
		{
			z++;
			_a/=p;
		}
	}
	if(_b==0)
	{
		z--;
		_b=(i+1)/p;
		while(_b%p==0)
		{
			z--;
			_b/=p;
		}
	}
	a*=_a;
	b*=_b;
	a%=p;
	b%=p;
	*pa=a;
	*pb=b;
	*pz=z;
	if(z>0)return 0;
	if(z<0)throw 0;
	while(a%b)
		a+=p;
	return a/b;
}
int main()
{
	int t;
	cin>>t;
	long long temp;
	long long result;
	long long x,y,p,k;
	long long fc;
	for(long long i=0;i<t;i++)
	{
		cin>>x>>y>>p>>k;
		for(long long j=0;j<k;j++)
			cin>>temp;
		x=x/10+((x%10>0)?1:0);
		y=y/10+((y%10>0)?1:0);
		fc=x+y-1;
		long long po=1;
		for(long long i=0;i<fc;i++)
			po=po*2%p;
		long long gc=0;
		long long preA=1,preB=1;
		int __z=0;
		for(long long i=0;i<x;i++)
		{
			long long h=ckkp(fc,i-1,p,&preA,&preB,&__z);
			gc+=h;
			gc%=p;
		}
		for(long long i=0;i<p;i++)
		{
			long long test=(i*po)%p;
			if(test==gc)
			{
				result=i;
				break;
			}
		}
		cout<<result<<'\n';
	}
	return 0;
}
2024/11/23 09:31
加载中...