QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#550882#9248. An Easy Math Problemucup-team052#Compile Error//C++203.5kb2024-09-07 14:34:072024-09-07 14:34:08

Judging History

This is the latest submission verdict.

  • [2024-10-31 22:36:43]
  • hack成功,自动添加数据
  • (/hack/1098)
  • [2024-10-31 22:13:58]
  • hack成功,自动添加数据
  • (/hack/1096)
  • [2024-10-31 22:00:43]
  • hack成功,自动添加数据
  • (/hack/1095)
  • [2024-09-07 14:34:08]
  • Judged
  • [2024-09-07 14:34:07]
  • Submitted

answer

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

typedef long long ll;
#define mod 998244353
int add(int x,int y) {return x+y>=mod?x+y-mod:x+y;}
int sub(int x,int y) {return x-y<0?x-y+mod:x-y;}
int mul(int x,int y) {return 1ULL*x*y%mod;}
#define N 5005
char k[N];
int p,x,g,pw[N],lg[N],vis[N];
int C[N][N];
int a[N];
const int i2=(mod+1)/2;
int Inv(int x)
{
	int y=mod-2,ans=1;
	while(y)
	{
		if(y&1) ans=mul(ans,x);
		x=mul(x,x),y>>=1;
	}
	return ans;
}
int qpow(int x,int y)
{
	int ans=1;
	while(y)
	{
		if(y&1) ans=mul(ans,x);
		x=mul(x,x),y>>=1;
	}
	return ans;
}
void dft(int f[])
{
	static int g[N];
	for(int i=0;i<p-1;i++)
	{
		g[i]=0;
		for(int j=0;j<p-1;j++) g[i]=add(g[i],mul(f[j],pw[i*j%(p-1)]));
	}
	for(int i=0;i<p-1;i++) f[i]=g[i];
}
void idft(int f[])
{
	static int g[N];
	for(int i=0;i<p-1;i++)
	{
		g[i]=0;
		for(int j=0;j<p-1;j++) g[i]=add(g[i],mul(f[j],pw[(p-1-i)*j%(p-1)]));
	}
	for(int i=0;i<p-1;i++) f[i]=g[i];
}
namespace Poly
{
	vector<int> rev,rt,one(1,1);
	int __inv[2000005];
	const int G=3;
	void Init_Inv()
	{
		__inv[0]=__inv[1]=1;
		for(int i=2;i<=2000000;i++) __inv[i]=mul(mod-mod/i,__inv[mod%i]);
	}
	vector<int> operator + (vector<int> a,vector<int> b)
	{
		int n=max(a.size(),b.size());
		a.resize(n),b.resize(n);
		for(int i=0;i<n;i++) a[i]=add(a[i],b[i]);
		return a;
	}
	vector<int> operator - (vector<int> a,vector<int> b)
	{
		int n=max(a.size(),b.size());
		a.resize(n),b.resize(n);
		for(int i=0;i<n;i++) a[i]=sub(a[i],b[i]);
		return a;
	}
	void init(int B)
	{
		int n=1<<B;
		rev.resize(n),rt.resize(n);
		for(int i=1;i<n;i++) rev[i]=(rev[i>>1]>>1)|((i&1)<<(B-1));
		for(int mid=1;mid<n;mid<<=1)
		{
			int w=qpow(G,(mod-1)/(mid<<1));
			rt[mid]=1;
			for(int i=1;i<mid;i++) rt[mid+i]=mul(rt[mid+i-1],w);
		}
	}
	void ntt(vector<int> &a,int B)
	{
		for(int i=0;i<(int)a.size();i++) if(rev[i]>i) swap(a[rev[i]],a[i]);
		for(int i=1;i<1<<B;i<<=1)
		{
			for(int j=0;j<1<<B;j+=i<<1)
			{
				for(int k=0;k<i;k++)
				{
					int x=a[j+k],y=mul(a[i+j+k],rt[i+k]);
					a[j+k]=add(x,y),a[i+j+k]=sub(x,y);
				}
			}
		}
	}
	void idft(vector<int> &a,int B)
	{
		reverse(a.begin()+1,a.end()); ntt(a,B);
		int I=Inv(1<<B);
		for(int i=0;i<(int)a.size();i++) a[i]=mul(a[i],I);
	}
	vector<int> operator * (vector<int> x,vector<int> y)
	{
		int n=x.size()+y.size()-1;
		int B=0; while(1<<B<n) B++;
		x.resize(1<<B),y.resize(1<<B);
		// init(B);
		ntt(x,B),ntt(y,B);
		for(int i=0;i<1<<B;i++) x[i]=mul(x[i],y[i]);
		idft(x,B);
		x.resize(n);
		int s=x.size();
		while(s>p-1)
		{
			x[s-p]=add(x[s-p],s[s-1]);
			s--,x.pop_back();
		}
		return x;
	}
};
using namespace Poly;
int b[N];
signed main() {
#ifdef xay5421
	freopen("b.in","r",stdin);
#endif
	scanf("%s",k+1); int l=strlen(k+1);
	cin>>p>>x;
	for(int i=2;i<p;i++)
	{
		g=i;
		memset(vis,0,sizeof(vis));
		int ok=1,cur=1;
		for(int j=0;j<p-1;j++)
		{
			if(vis[cur]) ok=0;
			pw[j]=cur,lg[cur]=j;
			vis[cur]=1,cur=cur*g%p;
		}
		if(ok) break;
	}
	pw[0]=1;
	for(int i=1;i<p;i++) pw[i]=mul(pw[i-1],g);
	cout<<g<<endl;
	for(int j=1;j<p-1;j++) printf("%d%c",lg[j]," \n"[j==p-2]);
	C[0][0]=1;
	for(int i=1;i<=p;i++)
	{
		C[i][0]=1;
		for(int j=1;j<=i;j++) C[i][j]=(C[i-1][j]+C[i-1][j-1])%p;
	}
	for(int i=0;i<p;i++) for(int j=0;j<p;j++) if(C[i][j]) a[lg[C[i][j]]]++;
	int B=0; while(1<<B<(p+p)) B++;
	init(B);
	vector<int> ans(1,1),f(a,a+p-1);
	for(int i=l;i>=1;i--)
	{
		if(k[i]=='1') ans=ans*f;
		f=f*f;
	}
	printf("%d\n",f[lg[x]]);
	return 0;
}

Details

answer.code: In function ‘std::vector<int> Poly::operator*(std::vector<int>, std::vector<int>)’:
answer.code:125:44: error: invalid types ‘int[int]’ for array subscript
  125 |                         x[s-p]=add(x[s-p],s[s-1]);
      |                                            ^
answer.code: In function ‘int main()’:
answer.code:137:14: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
  137 |         scanf("%s",k+1); int l=strlen(k+1);
      |         ~~~~~^~~~~~~~~~