求卡常,本地能跑1.7s,交上去2.2sTLE
  • 板块学术版
  • 楼主WhitD
  • 当前回复9
  • 已保存回复9
  • 发布时间2023/9/28 16:36
  • 上次更新2023/11/2 17:43:46
查看原帖
求卡常,本地能跑1.7s,交上去2.2sTLE
408385
WhitD楼主2023/9/28 16:36
#include<iostream>
using namespace std;
namespace fastio
{
    struct reader
	{
    	template<typename T>reader&operator>>(T&x)
		{
    		char c=getchar();short f=1;
    		while(c<'0'||c>'9')
				{if(c=='-')f*=-1;c=getchar();}
    		x=0;
			while(c>='0'&&c<='9')
    			x=(x<<1)+(x<<3)+(c^48),c=getchar();
    		x*=f;
			return *this;
    	}
    }cin;
    struct writer
	{
        template<typename T>writer&operator<<(T x)
		{
    		if(x==0)
				return putchar('0'),*this;
    		if(x<0)
				putchar('-'),x=-x;
    		static int sta[45];int top=0;
    		while(x)
				sta[++top]=x%10,x/=10;
    		while(top)
				putchar(sta[top]+'0'),--top;
    		return *this;
    	}
    }cout;
    #define cin fastio::cin
	#define cout fastio::cout
};
const int N=100005;
inline int _min(int a,int b){return (a<b)?a:b;}
inline int _max(int a,int b){return (a>b)?a:b;}
inline int _ceil(double x){return (int(x)==x)?int(x):(int)(x+1);}
inline void exgcd(int a,int b,int &x,int &y)
{
	if(!b)
	{
		x=1,y=0;
		return ;
	}
	exgcd(b,a%b,y,x),y-=x*(a/b);
}
inline int inv(int v,int p)
{
	int x,y;
	exgcd(v,p,x,y);
	return (x%p+p)%p;
}
inline int qkpow(int a,int b,int p)
{
	int res=1;
	while(b)
	{
		if(b&1) 
			res=res*a;
		a=a*a%p;
		b>>=1;
	}
	return res%p;
}
inline int fac(int n,int pi,int pk)
{
	if(!n) 
		return 1;
	int ans=1;
	for(register int i=2;i<pk;++i) 
		if(i%pi) 
			ans=ans*i%pk;
	ans=qkpow(ans,n/pk,pk);
	for(register int i=2;i<=n%pk;++i) 
		if(i%pi) 
			ans=ans*i%pk;
	return ans*fac(n/pi,pi,pk)%pk;
}
inline int l(int n,int m,int pi,int pk)
{
	int ind=0;
	for(register int i=n;i;i/=pi) 
		ind+=i/pi;
	for(register int i=m;i;i/=pi) 
		ind-=i/pi;
	for(register int i=n-m;i;i/=pi) 
		ind-=i/pi;
	int x=fac(n,pi,pk),y=fac(m,pi,pk),z=fac(n-m,pi,pk);
	return x*inv(y,pk)%pk*inv(z,pk)%pk*qkpow(pi,ind,pk)%pk;
}
inline int c(int n,int m,int p)
{
	int tmp=p,ans=0;
	for(register int i=2;i*i<=tmp;++i)
		if(tmp%i==0)
		{
			int pk=1;
			while(tmp%i==0) 
			{
				tmp/=i;
				pk*=i;
			}
			ans=(ans+l(n,m,i,pk)*inv(p/pk,pk)%p*p/pk%p)%p;
		}
	if(tmp>1) 
		ans=(ans+l(n,m,tmp,tmp)*inv(p/tmp,tmp)%p*p/tmp%p)%p;
	return ans%p;
}
int score[10]={0,1,10,15,25,40,55,75,100};
int T,n,m,p,s[N],mn,sum,x,k,cnt,ans;
int main()
{
	//freopen("P4993_4.in","r",stdin);
	cin>>T;
	while(T--)
	{
		ans=0,sum=0,cnt=0,mn=0x7fffffff;
		cin>>n>>m>>p;
		for(register int i=1;i<=n;++i)
			cin>>s[i];
		for(register int i=1,t;i<=m;++i)
			cin>>t,mn=_min(mn,score[t]),sum+=score[t];
		sum-=mn;
		x=_max(1,_ceil((71.0*m-sum-42.0)/29.0));
		cin>>k;
		for(register int i=1;i<=n;++i)
			if(s[i]>=k)
				cnt++;
		for(x;x<=cnt;++x)
			ans=(ans+c(cnt,x,p));
		cout<<(ans%p);
		puts("");
	}
	return 0;
}
2023/9/28 16:36
加载中...