代码求调
查看原帖
代码求调
557800
luuia楼主2024/3/9 23:30

rt.

本地能输出,交上去显示全部是 00,已经改的快跟题解一样了。。

#include <bits/stdc++.h>
using namespace std;

long long read()
{
    long long s = 0,w = 1;
    char ch = getchar();
    while(ch < '0' || ch > '9')
    {
        if(ch == '-') w = -1;
        ch = getchar();
    }
    while(ch >= '0' && ch <= '9')
    {
        s = (s << 1) + (s << 3) + (ch ^ 48);
        ch = getchar();
    }
    return s * w;
}

const int N = 5e4 + 10,mod = 999911658;
long long q[N],r[N],x[N],b[5];
long long T,n,m,g,f[N];
long long multiple = 1,ans;

void init(long long x)
{
    f[0] = 1;
    for(int i = 1;i <= N;i++) f[i] = (f[i - 1] * i) % x;
}

long long exgcd(long long a,long long b,long long &x,long long &y)
{
    long long t;
    if (b == 0)
    {
        x = 1;
        y = 0;
        return a;
    }
    else
    {
        t = exgcd(b,a % b,x,y);
        int xx = x;
        x = y;
        y = xx - a / b * y;
        return t;
    }
}

long long quickpow(long long c,long long n,long long m)
{
	long long res = 1;
	while(n)
	{
		if(n & 1) res = res * c % m;
		c = c * c % m;
		n >>= 1;
	}	
	return res;
}

long long C(long long n,long long m,long long p)
{
    if(m > n)return 0;
    return((f[n] * quickpow(f[m],p - 2,p)) % p * quickpow(f[n - m],p - 2,p) % p);
}

long long Lucas(long long n, long long m, long long p) 
{
    if (m == 0) return 1;
    return (C(n % p, m % p, p) * Lucas(n / p, m / p, p)) % p;
}

int a[5] = {0,2,3,4679,35617};

long long CRT()
{
    for(int i = 1;i <= 4;i++)
    {
        q[i] = a[i];
        multiple = multiple * a[i];
    }
    for(int i = 1;i <= 4;i++)
    {
        r[i] = multiple / q[i];
        long long x = 0,y = 0;
        exgcd(r[i],q[i],x,y);
        if (x < 0) ans += b[i] * r[i] * (x + q[i]);
        else ans += b[i] * r[i] * x;
    }
    return ans % multiple;
}

int main()
{
    //freopen("input.in","r",stdin);
    n = read(),g = read();
    if(g % 999911659 == 0){cout << 0 << endl;return 0;}
    for(int i = 1;i <= 4;i++)
    {
        init(a[i]);
        for(int j = 1;j * j <= n;j++)
        {
            if(n % j == 0)
            {
                b[i] = (b[i] + Lucas(n,j,a[i])) % a[i];
				if(j * j == n) continue;
				b[i] = (b[i] + Lucas(n,n / j,a[i])) % a[i];
            }
        }
    }
    cout << quickpow(g,CRT(),mod) << endl;
    return 0;
}
2024/3/9 23:30
加载中...