UOJ Logo

NOI.AC

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#203542#3566. T1snow_trace100111ms3324kbC++111.9kb2024-02-27 10:07:232024-02-27 13:03:15

answer

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod = 998244353;
int n;
int a[100005]; 
int qp(int p,int q){
	int ans = 1,pro = p%mod;
	while(q){
		if(q&1)ans = ans*pro%mod;
		pro = pro*pro%mod;q>>=1;
	}return ans;
}struct poly{
	int k,b;
	poly(){};
	poly(int K,int B) : k(K%mod),b(B%mod){}
	friend poly operator*(poly a,poly b){
		poly c(0,0);
		c.k = (a.b*b.k+a.k*b.b)%mod;
		c.b = (a.b*b.b+a.k*b.k)%mod;
		return c;
	}
};
poly p[100005];
poly NTT(int l,int r){//最分治NTT的一集 
//	cout << l << " " << r << endl; 
	if(l>r)return poly(0,1);
	if(l == r)return p[l];
	int mid = l+r>>1;return NTT(l,mid)*NTT(mid+1,r);
}
signed main(){
	ios::sync_with_stdio(0);cin.tie(0);
	cin>>n;for(int i = 1;i<=n;i++)cin >> a[i];
	int ans = 0;
	for(int i = 31;i>=0;i--){
		vector<int>pp;
		for(int j = 1;j<=n;j++){
			if(a[j]>>i&1)pp.push_back(a[j]);
		}int pro = 1,tot =0 ;
		for(int j = 1;j<=n;j++){
			if(a[j]>>i&1)tot++;
			else pro = pro*(a[j]+1)%mod;
		}for(int j = 0;j<pp.size();j++){
			p[j+1].k = 1+pp[j]-(1ll<<i);
			p[j+1].b = (1ll<<i);
			//cout << p[j+1].k << " " << p[j+1].b << endl;
		}
		auto res = NTT(1,pp.size());
	//	cout << "  " << pp.size() << " " << res.b << endl; 
		ans = ans+(pro*res.b%mod*qp(1ll<<i,mod-2));ans%=mod;
		for(int j = 1;j<=n;j++)if(a[j]>>i&1){
			a[j]-=(1ll<<i);pro = pro*(a[j]+1)%mod;
		}
		if(tot%2 == 0)ans = ans-pro*qp(1ll<<i,mod-2);;ans%=mod;ans+=mod;ans%=mod;
		if(tot%2 == 1)break; 
	}cout << ans << endl; 
	return 0;
}/*
一般来说,如果你看到 998244353,又看到 n = 1e5,又看到 2s,那大概就又是一个毒瘤题。 
由特殊性质的启发可以想到。
如果最高位有个元素没被消掉就拿他干点事情。
生成函数 \prod (ai*x+bi)
但是我们只需要求偶数项之和。
于是我们上分治 NTT(确信)
分治,然后算二项式的乘法。
这题真是令人感到难绷。 
原来不分治也是对的。 
*/

详细

小提示:点击横条可展开更详细的信息

Subtask #1:

score: 10
Accepted

Test #1:

score: 10
Accepted
time: 0ms
memory: 1272kb

input:

10
3 5 0 1 0 3 5 4 2 5

output:

13248

result:

ok 1 number(s): "13248"

Subtask #2:

score: 10
Accepted

Test #2:

score: 10
Accepted
time: 24ms
memory: 3232kb

input:

100000
25 0 7 1 42 27 29 17 26 23 11 4 24 40 31 10 6 16 26 26 46 27 7 32 9 33 17 15 4 44 36 29 19 17...

output:

460821675

result:

ok 1 number(s): "460821675"

Subtask #3:

score: 10
Accepted

Test #3:

score: 10
Accepted
time: 23ms
memory: 3232kb

input:

100000
14 25 9 27 9 33 48 28 10 29 28 39 50 33 8 18 38 0 34 25 13 7 30 48 13 39 14 11 40 8 32 3 7 16...

output:

885189946

result:

ok 1 number(s): "885189946"

Subtask #4:

score: 10
Accepted

Test #4:

score: 10
Accepted
time: 13ms
memory: 2040kb

input:

100000
999998102 402961903 309346107 445160702 274308544 145846539 341002420 77841978 313436667 3206...

output:

714756233

result:

ok 1 number(s): "714756233"

Subtask #5:

score: 10
Accepted

Test #5:

score: 10
Accepted
time: 13ms
memory: 2044kb

input:

100000
999998479 400795186 127605328 439009686 279338791 222344190 32214702 347490239 390113609 1737...

output:

885251777

result:

ok 1 number(s): "885251777"

Subtask #6:

score: 10
Accepted

Test #6:

score: 10
Accepted
time: 13ms
memory: 2044kb

input:

100000
999980995 341927799 474797020 355936070 215296904 77682610 413850993 194378088 233473841 3566...

output:

99729538

result:

ok 1 number(s): "99729538"

Subtask #7:

score: 10
Accepted

Test #7:

score: 10
Accepted
time: 1ms
memory: 1320kb

input:

2000
540706819 309629779 17707890 194083691 334726587 456162964 498417390 246765617 957682339 604730...

output:

800177499

result:

ok 1 number(s): "800177499"

Subtask #8:

score: 10
Accepted

Test #8:

score: 10
Accepted
time: 0ms
memory: 1320kb

input:

2000
101722906 988313572 550840902 777765553 778991206 95817204 989809443 357040014 425595004 794587...

output:

443206431

result:

ok 1 number(s): "443206431"

Subtask #9:

score: 10
Accepted

Test #9:

score: 10
Accepted
time: 19ms
memory: 3320kb

input:

100000
327468559 836395032 98737045 14714567 147268924 355455125 829199457 117664948 79547712 117935...

output:

252529800

result:

ok 1 number(s): "252529800"

Subtask #10:

score: 10
Accepted

Test #10:

score: 10
Accepted
time: 5ms
memory: 3324kb

input:

100000
334373908 573410989 584461609 757523993 595819683 93095595 866600961 552146722 657326632 1804...

output:

633437866

result:

ok 1 number(s): "633437866"