QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#406180#8017. 计算paul2008Compile Error//C++142.2kb2024-05-06 22:03:422024-05-06 22:03:44

Judging History

你现在查看的是最新测评结果

  • [2024-05-06 22:03:44]
  • 评测
  • [2024-05-06 22:03:42]
  • 提交

answer

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

#define int long long

const int Mod=998244353;

int olddp[2005], newdp[2005], ans[2005], mul[2005];

void add(int& x,int y)
{
	x += y;
	if(x>=Mod)
		x -= Mod;
}

int a[5005], b[5005], w[5005], k;

int qsm(int x,int y)
{
	if(!y)
		return 1;

	int t=qsm(x,y/2);
	if(y%2==0)
		return t*t%Mod;
	return t*t%Mod*x%Mod;
}

void NTT(int a[])
{
	int rev=0;
    for(int i=0;i<k;i++)
    {
        if(i<rev)
            swap(a[i],a[rev]);
        for(int j=k>>1;(rev^=j)<j;j>>=1);
    }

    for(int n=2;n<=k;n<<=1)
    {
        int m=n>>1,sz=k/n;
        for(int i=0;i<k;i+=n)
            for(int p=0;p<m;p++)
            {
                long long L=a[i+p], R=a[i+m+p]*w[sz*p]%Mod;
                a[i+p]=L+R>=Mod?L+R-Mod:L+R;
                a[i+p+m]=L-R<0?L-R+Mod:L-R;
            }
    }
}

void Mul(int n,int A[],int B[])
{
	k=1;
	while(k<=n*2+2)
		k *= 2;

	for(int i=0;i<k;i++)
		a[i]=A[i], b[i]=B[i];

	w[0]=1;
	int P=qsm(3,(Mod-1)/k);
	for(int i=1;i<k;i++)
		w[i]=w[i-1]*P%Mod;

	NTT(a), NTT(b);
	for(int i=0;i<k;i++)
		a[i]=a[i]*b[i]%Mod;
	NTT(a);

	long long inv=qsm(k,Mod-2);
	for(int i=0;i<k;i++)
		b[i]=a[(k-i)%k]*inv%Mod;

	for(int i=0;i<n;i++)
		A[i]=0;

	for(int i=0;i<k;i++)
		(A[i%n] += b[i]) %= Mod;
}

int Mul(int x,int y)
{
	int ans=1;
	for(int i=1;i<=y;i++)
		ans *= x;
	return ans;
}

void work()
{
	int m,a,b,c,d;
	cin >> m >> a >> b >> c >> d;

	memset(ans,0,sizeof(ans));
	memset(mul,0,sizeof(mul));
	memset(newdp,0,sizeof(newdp));
	newdp[0]=1;
	for(int i=0;i<m;i++)
	{
		memcpy(olddp,newdp,sizeof(newdp));
		memset(newdp,0,sizeof(newdp));
		for(int j=0;j<m;j++)
		{
			(newdp[(j+i)%m] += olddp[j]) %= Mod;
			(newdp[j] += olddp[j]) %= Mod;
		}
	}

	int L,R;
	if(a==0 || b==0)
		L=1;
	else
		L=Mul(m,gcd(a,b))+1;

	if(c==0 || d==0)
		R=0;
	else
		R=Mul(m,gcd(c,d));

	for(int i=0;i<m;i++)
		mul[i]=newdp[i];

	ans[0]=1;
	int cnt=(R-L+1)/m;
	for(int i=0;i<60;i++)
	{
		if((cnt>>i)&1)
			Mul(m,ans,mul);
		Mul(m,mul,mul);
	}

	printf("%lld\n",ans[0]);
}

signed main()
{
	int T;
	cin >> T;
	while(T--)
		work();
	return 0;
}

詳細信息

answer.code: In function ‘void work()’:
answer.code:115:25: error: ‘gcd’ was not declared in this scope
  115 |                 L=Mul(m,gcd(a,b))+1;
      |                         ^~~
answer.code:120:25: error: ‘gcd’ was not declared in this scope
  120 |                 R=Mul(m,gcd(c,d));
      |                         ^~~