提交记录 11403


用户 题目 状态 得分 用时 内存 语言 代码长度
skip1978 1002i. 【模板题】多项式乘法 Accepted 100 23.882 ms 7596 KB C++ 2.10 KB
提交时间 评测时间
2020-01-03 14:53:18 2020-08-01 02:43:12
#include<bits/stdc++.h>
const int maxn = 1 << 18;
const int mod = 81788929; 
const int inv2 = mod + 1 >> 1;
typedef long long ll;
int n, m;
struct istream
{
	static const int size = 1 << 19;
	char buf[size], *vin;
	inline istream()
	{
		scanf("%d%d\n",&n,&m);
		fread(buf,1,size,stdin);
		vin = buf - 1;
	}
	inline istream& operator >> (int & x)
	{
		x = *++vin & 15, ++ vin;
		return * this;
	}
} cin;
struct ostream
{
	static const int size = 1 << 21;
	char buf[size], *vout;
	inline ostream()
	{ vout = buf + size; }
	inline ~ ostream()
	{ fwrite(vout,1,buf + size - vout,stdout); }
	inline ostream& operator << (int x)
	{
		do *--vout = x % 10 + 48; while(x /= 10);
		return * this;
	}
	inline ostream& operator << (char x)
	{
		*--vout = x;
		return * this;
	}
} cout;
inline int pow(int a,int b,int ans = 1)
{
	for(;b;b >>= 1,a = (ll) a * a % mod) if(b & 1)
		ans = (ll) ans * a % mod;
	return ans;
}
using AI = int[maxn];
AI wn, rev;
namespace poly
{
	int lim,invlim;
	inline void init(int len)
	{
		for(lim = invlim = 1;lim < len;lim <<= 1) invlim = (ll) invlim * inv2 % mod;
		for(int i = 1;i < lim;++i) rev[i] = rev[i >> 1] >> 1 | (i % 2 * lim / 2);
		for(int mid = 1;mid < maxn;mid <<= 1)
		{
			const int W = pow(7,mod / mid / 2); wn[mid] = 1;
			for(int i = 1;i < mid;++i) wn[mid + i] = (ll) wn[mid + i - 1] * W % mod;
		}
	}
	inline void fft(int * a,int type)
	{
		for(int i = 0;i < lim;++i) if(rev[i] > i) std::swap(a[i], a[rev[i]]);
		for(int mid = 1;mid < lim;mid <<= 1)
			for(int i = 0;i < lim;i += mid + mid)
				for(int j = 0;j < mid;++j)
				{
					const int x = (ll) a[i + j + mid] * wn[mid + j] % mod;
					a[i + j + mid] = mod - x + a[i + j]; a[i + j] += x;
				}
		for(int i = 0;i < lim;++i) a[i] %= mod;
		if(!type)
		{
			for(int i = 0;i < lim;++i) a[i] = (ll) a[i] * invlim % mod;
			std::reverse(a + 1,a + lim);
		}
	}
}
AI a, b;
int main()
{
	for(int i = 0;i <= n;++i) cin >> a[i];
	for(int i = 0;i <= m;++i) cin >> b[i];
	poly::init(n + m + 1);
	poly::fft(a, 1);
	poly::fft(b, 1);
	for(int i = 0;i < poly::lim;++i) a[i] = (ll) a[i] * b[i] % mod;
	poly::fft(a, 0);
	for(int i = n + m;i >= 0;--i) cout << ' ' << a[i];
}

CompilationN/AN/ACompile OKScore: N/A

Subtask #1 Testcase #11.471 ms1 MB + 56 KBAcceptedScore: 0

Subtask #1 Testcase #223.684 ms7 MB + 268 KBAcceptedScore: 100

Subtask #1 Testcase #311.291 ms3 MB + 300 KBAcceptedScore: 0

Subtask #1 Testcase #411.308 ms3 MB + 280 KBAcceptedScore: 0

Subtask #1 Testcase #51.473 ms1 MB + 56 KBAcceptedScore: 0

Subtask #1 Testcase #61.472 ms1 MB + 56 KBAcceptedScore: 0

Subtask #1 Testcase #71.471 ms1 MB + 56 KBAcceptedScore: 0

Subtask #1 Testcase #823.177 ms6 MB + 692 KBAcceptedScore: 0

Subtask #1 Testcase #923.123 ms6 MB + 692 KBAcceptedScore: 0

Subtask #1 Testcase #1022.576 ms6 MB + 84 KBAcceptedScore: 0

Subtask #1 Testcase #1123.882 ms7 MB + 428 KBAcceptedScore: 0

Subtask #1 Testcase #1221.72 ms5 MB + 188 KBAcceptedScore: 0

Subtask #1 Testcase #131.47 ms1 MB + 56 KBAcceptedScore: 0


Judge Duck Online | 评测鸭在线
Server Time: 2024-04-23 18:46:25 | Loaded in 1 ms | Server Status
个人娱乐项目,仅供学习交流使用