3 条题解

  • 7
    @ 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);
    	
    }
    
    
    • 0
      @ 2025-12-23 18:55:25

      #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=i2;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&a,int b)//高精度 { ll t=0; for(int i=0;i<a.size();i++) { a[i]=1lla[i]*b+t; t=a[i]/1000000000; a[i]%=1000000000; } while(t) { a.push_back(t%1000000000); t/=1000000000; } } void out(vector&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(n2); for(int i=0;i<cnt;i++) { int p=prime[i]; power[p]=get(n2,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; } vectorres; res.push_back(1ll); for(int i=2;i<=n2;i++) { for(int j=0;j<power[i];j++) { multi(res,i); } } out(res);

      }

      • -7
        @ 2022-10-30 16:52:53
        • 1

        信息

        ID
        41
        时间
        5000ms
        内存
        512MiB
        难度
        2
        标签
        递交数
        124
        已通过
        73
        上传者