Submission #15796955


Source Code Expand

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=200100,P=200003;
const double pi=acos(-1);
int n,a[N],f[P],p[P];
int len,rev[P*4];
struct com
{
	long double real,ima;
}g[P*4];
com operator+(com a,com b){return(com){a.real+b.real,a.ima+b.ima};}
com operator-(com a,com b){return(com){a.real-b.real,a.ima-b.ima};}
com operator*(com a,com b){return(com){a.real*b.real-a.ima*b.ima,a.real*b.ima+b.real*a.ima};}
inline void change(int len)
{
	for (int i=0;i<len;i++)
	{
		rev[i]=rev[i>>1]>>1;
		if (i&1) rev[i]|=len>>1;
	}
}
inline void fft(com y[],int len,int v)
{
	for (int i=0;i<len;i++) if (i<rev[i]) swap(y[i],y[rev[i]]);
	for (int i=2;i<=len;i<<=1)
	{
		com step=(com){cos(2.0*pi/i),sin(v*2.0*pi/i)};
		for (int j=0;j<len;j+=i)
		{
			com x=(com){1.0,0};
			for (int k=j;k<j+i/2;k++)
			{
				com a=y[k],b=x*y[k+i/2];
				y[k]=a+b,y[k+i/2]=a-b;
				x=x*step;
			}
		}
	}
	if (v==-1) for (int i=0;i<len;i++) y[i].real/=1.0*len;
}
signed main()
{
	scanf("%lld",&n);
	for (int i=1;i<=n;i++) scanf("%lld",&a[i]);
	f[1]=0;
	int x=1;
	for (int i=1;i<P-1;i++) x=(x+x)%P,f[x]=i;
	p[0]=1;
	for (int i=1;i<P-1;i++) p[i]=(p[i-1]+p[i-1])%P;
	for (int i=1;i<=n;i++) if (a[i]!=0) g[f[a[i]]].real+=1;
	len=1;
	while (len<P+P) len<<=1;
	change(len);
	fft(g,len,1);
	for (int i=0;i<len;i++) g[i]=g[i]*g[i];
	fft(g,len,-1);
	for (int i=1;i<=n;i++) if (a[i]!=0) g[f[a[i]]*2].real-=1;
	int ans=0;
	for (int i=0;i<len;i++) ans+=p[i%(P-1)]*((int)(g[i].real+0.5)/2);
	printf("%lld\n",ans);
}

Submission Info

Submission Time
Task C - Product Modulo
User SevenDawns
Language C++ (GCC 9.2.1)
Score 800
Code Size 1563 Byte
Status AC
Exec Time 166 ms
Memory 29276 KiB

Compile Error

./Main.cpp: In function ‘int main()’:
./Main.cpp:44:7: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
   44 |  scanf("%lld",&n);
      |  ~~~~~^~~~~~~~~~~
./Main.cpp:45:30: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
   45 |  for (int i=1;i<=n;i++) scanf("%lld",&a[i]);
      |                         ~~~~~^~~~~~~~~~~~~~

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 800 / 800
Status
AC × 2
AC × 15
Set Name Test Cases
Sample s1.txt, s2.txt
All 001.txt, 002.txt, 003.txt, 004.txt, 005.txt, 006.txt, 007.txt, 008.txt, 009.txt, 010.txt, 011.txt, 012.txt, 013.txt, s1.txt, s2.txt
Case Name Status Exec Time Memory
001.txt AC 146 ms 27556 KiB
002.txt AC 144 ms 27760 KiB
003.txt AC 143 ms 27800 KiB
004.txt AC 157 ms 28464 KiB
005.txt AC 161 ms 29212 KiB
006.txt AC 155 ms 29220 KiB
007.txt AC 158 ms 29240 KiB
008.txt AC 157 ms 29164 KiB
009.txt AC 160 ms 29276 KiB
010.txt AC 163 ms 29212 KiB
011.txt AC 162 ms 29220 KiB
012.txt AC 166 ms 29216 KiB
013.txt AC 147 ms 27648 KiB
s1.txt AC 148 ms 27592 KiB
s2.txt AC 147 ms 27728 KiB