QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#234406#3840. Pass the Ball!GFFFCompile Error//C++142.2kb2023-11-01 16:56:482023-11-01 16:56:49

Judging History

This is the latest submission verdict.

  • [2023-11-01 16:56:49]
  • Judged
  • [2023-11-01 16:56:48]
  • Submitted

answer

#include<bits/stdc++.h>
using namespace std;
typedef __float128 ld;
typedef long long ll;
const int maxn=1e6+5;
const ld pi=acosl(-1.0);
struct cpl{
	ld x,y;
	cpl friend operator + (const cpl a,const cpl b) {return (cpl){a.x+b.x,a.y+b.y};}
	cpl friend operator - (const cpl a,const cpl b) {return (cpl){a.x-b.x,a.y-b.y};}
	cpl friend operator * (const cpl a,const cpl b) {return (cpl){a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x};}
}A[maxn],B[maxn],C[maxn];
struct FNTT{
	int mx,tim,r[maxn];
	void FFT(cpl *a,int op)
	{
		for(int i=0;i<mx;++i) if(i<r[i]) swap(a[i],a[r[i]]);
		for(int mid=1;mid<mx;mid<<=1)
		{
			cpl wn=(cpl){cosl(pi/mid),op*sinl(pi/mid)};
			for(int i=0,len=mid<<1;i<mx;i+=len)
			{
				cpl w=(cpl){1,0};
				for(int j=0;j<mid;++j,w=w*wn)
				{
					cpl x=a[i+j],y=w*a[i+mid+j];
					a[i+j]=x+y;a[i+mid+j]=x-y;
				}
			}
		}
		if(op==1) return ;
		for(int i=0;i<mx;++i) a[i].x/=mx;
	}
	int getlen(int n) {for(mx=1,tim=0;mx<=n;mx<<=1,++tim);return mx;}
	void Mul(int n,int *a,int *b,ll *c)
	{
		for(int i=0;i<mx;++i) r[i]=(r[i>>1]>>1)|((i&1)<<(tim-1));
		for(int i=0;i<mx;++i) A[i]=(cpl){1.0*a[i],0},B[i]=(cpl){1.0*b[i],0};
		FFT(A,1);FFT(B,1);
		for(int i=0;i<mx;++i) C[i]=A[i]*B[i];
		FFT(C,-1);
		for(int i=0;i<n;++i) c[i]=(ll)(C[i].x+0.5);
	}
}fntt;
int n,cnt,q,p[maxn],yet[maxn],a[maxn],b[maxn];
ll ans,c[maxn];
vector<ll> d[maxn];
vector<int> bl[maxn];
vector<int> lenth;
void dfs(int x,int id)
{
	yet[x]=1;
	bl[id].push_back(x);
	if(!yet[p[x]]) dfs(p[x],id);
}
void work(int id)
{
	int N=bl[id].size();
	int mx=fntt.getlen(N*3);
	for(int i=0;i<mx;++i) a[i]=b[i]=c[i]=0;
	for(int i=0;i<N;++i) a[i]=b[i]=bl[id][i];
	reverse(b,b+N);
	for(int i=N;i<N*2;++i) b[i]=b[i-N];
	fntt.Mul(N*3,a,b,c);
	if(!d[N].size()) d[N].resize(N),lenth.push_back(N);
	for(int i=0;i<N;++i) d[N][i]+=c[i+N-1];
}
int main()
{
	scanf("%d%d",&n,&q);
	for(int i=1;i<=n;++i) scanf("%d",&p[i]);
	for(int i=1;i<=n;++i)
		if(!yet[i])
		{
			++cnt;
			dfs(i,cnt);
		}
	for(int i=1;i<=cnt;++i) work(i);
	for(int i=1,x;i<=q;++i)
	{
		scanf("%d",&x);
		ans=0;
		for(auto len:lenth) ans+=d[len][x%len];
		printf("%lld\n",ans);
	}
	return 0;
}
/*
5 100
2 3 1 5 4

Details

answer.code:88:1: error: unterminated comment
   88 | /*
      | ^
answer.code: In function ‘int main()’:
answer.code:70:14: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
   70 |         scanf("%d%d",&n,&q);
      |         ~~~~~^~~~~~~~~~~~~~
answer.code:71:36: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
   71 |         for(int i=1;i<=n;++i) scanf("%d",&p[i]);
      |                               ~~~~~^~~~~~~~~~~~
answer.code:81:22: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
   81 |                 scanf("%d",&x);
      |                 ~~~~~^~~~~~~~~