求助为何全部TLE
查看原帖
求助为何全部TLE
248872
y_dove楼主2020/7/3 20:29

rt,下载数据后发现本地秒出答案,交到洛谷上T成0分

/*多项式IN*/
#include<cstdio> 
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int mod = 998244353;
const int maxn = 1e6 + 10;
int G = 3,Gi;
int rk[maxn],A[maxn],c[maxn],dA[maxn],B[maxn],invA[maxn];/*A的导数*/
int qpow(int x,int y){
	int ans = 1;
	while(y){
		if(y & 1)	ans = 1ll * ans * x % mod;
		x = 1ll * x * x % mod;
		y >>= 1;
	}
	return ans;
}
int Der(int *a,int *b,int n){/*求导*/ 
	for(int i = 1; i < n; ++i)
		b[i-1] = 1ll * i * a[i] % mod;
	b[n-1] = 0;
}
int InvDer(int *a,int *b,int n){/*积分*/
	for(int i = 1; i < n; ++i)
		b[i] = 1ll * a[i-1] * qpow(i,mod-2) % mod;
	b[0] = 0;
}
int mul(int a,int b){
	return 1ll * a * b % mod;
}
int drop(int a,int b){
	a -= b;
	return (a < 0)?a + mod:a;
}
int add(int a,int b){
	a += b;
	return (a >= mod)?a - mod : a;
}
void NTT(int *f,int type,int lim){
	for(int i = 0; i < lim; ++i)
		if(i > rk[i])	swap(f[i],f[rk[i]]);
	for(int j = 1; j < lim; j <<= 1){
		int Wn = qpow(type == 1?G:Gi,(mod - 1) / (j << 1));
		for(int Len = j << 1,i = 0; i < lim; i += Len){
			int w = 1;
			for(int k = 0; k < j; ++k,w = 1ll * w * Wn % mod){
				int x = f[i+k],y = 1ll * w * f[i+k+j] % mod;
				f[i+k] = add(x,y);
				f[i+k+j] = drop(x,y);
			}
		}
	}
	if(type == -1)
		for(int i = 0,inv = qpow(lim,mod-2); i < lim; ++i)
			f[i] = mul(f[i],inv);
}
void polyinv(int *f,int *g,int len){
	if(len == 1){
		g[0] = qpow(f[0],mod-2);
		return;
	}
	polyinv(f,g,len >> 1);
	int lim = 1;
	int l = 0;
	while(lim < len << 1)	lim <<= 1,l++;
	for(int i = 1; i <= lim; ++i)
		rk[i] = (rk[i >> 1] >> 1) | ((i & 1) << (l - 1));
	for(int i = 0; i < len; ++i)
		c[i] = f[i];
	for(int i = len; i <= lim; ++i)
		c[i] = 0;
	NTT(c,1,lim);	NTT(g,1,lim);
	for(int i = 0; i < lim; ++i)
		g[i] = drop((2ll * g[i]),mul((mul(g[i],g[i])),c[i]));
	NTT(g,-1,lim);
	for(int i = len; i < lim; ++i)		g[i] = 0;
}
void getIn(int *A,int *B,int n){
	int lim = 1,l = 0;
	while(lim < n)		lim <<= 1,l++;
	polyinv(A,invA,lim);
	Der(A,dA,lim);
	lim <<= 1,l++;
	for(int i = 1; i < lim; ++i)
		rk[i] = (rk[i >> 1] >> 1) | ((i & 1) << (l - 1));
	NTT(dA,1,lim);
	NTT(invA,1,lim);
	for(int i = 0; i < lim; ++i)
		dA[i] = mul(dA[i],invA[i]);
	NTT(dA,-1,lim);
	InvDer(dA,B,n);
}
int read(){
	char ch = getchar();
	int x = 0;
	while(ch < '0' || ch > '9')		ch = getchar();
	while(ch >= '0' && ch <= '9')	x = x * 10 + ch - 48,ch = getchar();
	return x;
}
int main(){
	Gi = qpow(G,mod-2);
	int n;
	scanf("%d",&n);
	for(int i = 0; i < n; ++i)
		scanf("%d",&A[i]);
	getIn(A,B,n);
	for(int i = 0; i < n; ++i)
		printf("%d ",B[i]);
	return 0; 
}  
2020/7/3 20:29
加载中...