2 条题解

  • 3
    @ 2023-1-27 17:03:44

    试了好多次才试出来的

    #include<bits/stdc++.h>
    typedef long long ll;
    using namespace std;
    const int N=120010;
    int prime[N],cnt;bool st[N];ll power[N];
    void getpr(int n)//筛素数
    {
    	for(int i=2;i<=n;i++)
    	{
    		if(!st[i])
    		{
    			prime[cnt++]=i;
    			for(int j=i*2;j<=n;j+=i)
    			{
    				st[j]=true;
    			}
    		}
    	}
    }
    int get(int n,int p)//判n!里面有p的几次
    {
    	int s=0;
    	while(n)
    	{
    		s+=n/p;
    		n/=p;
    	}return s;
    }
    void multi(vector<ll>&a,int b)//高精度
    {
    	ll  t=0;
    	for(int i=0;i<a.size();i++)
    	{
    		a[i]=1ll*a[i]*b+t;
    		t=a[i]/1000000000;
    		a[i]%=1000000000;
    	}
    	while(t)
    	{
    		a.push_back(t%1000000000);
    		t/=1000000000;
    	}
    }
    void out(vector<ll>&a)
    {
    	printf("%lld",a.back());
    	for(int i=a.size()-2;i>=0;i--)
    	{
    		printf("%09lld",a[i]);//压位
    	}
    	puts("");
    }
    
    int main()
    {
        int n;
    	scanf("%d",&n);
    	getpr(n*2);
    	for(int i=0;i<cnt;i++)
    	{
    		int p=prime[i];
    		power[p]=get(n*2,p)-get(n,p)*2;
    	}
    	int k=n+1;//考虑解决剩下的除数n+1
    	for(int i=0;i<cnt&&prime[i]<=k;i++)
    	{
    		int p=prime[i],s=0;
    		while(k%p==0)
    		{
    			s++;
    			k/=p;
    		}power[p]-=s;
    	} 
    	vector<ll>res;
    	res.push_back(1ll);
    	for(int i=2;i<=n*2;i++)
    	{
    		for(int j=0;j<power[i];j++)
    		{
    			multi(res,i);
    		}
    	}
    	out(res);
    	
    }
    
    
    • -3
      @ 2022-10-30 16:52:53
      • 1

      信息

      ID
      41
      时间
      5000ms
      内存
      512MiB
      难度
      3
      标签
      递交数
      97
      已通过
      49
      上传者