結果
| 問題 |
No.1753 Don't cheat.
|
| コンテスト | |
| ユーザー |
👑 potato167
|
| 提出日時 | 2022-03-18 00:39:37 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 498 ms / 3,000 ms |
| コード長 | 4,456 bytes |
| コンパイル時間 | 2,414 ms |
| コンパイル使用メモリ | 205,132 KB |
| 最終ジャッジ日時 | 2025-01-28 10:06:02 |
|
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 30 |
ソースコード
#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#define _GLIBCXX_DEBUG
using namespace std;
using std::cout;
using std::cin;
using std::endl;
using ll=long long;
using ld=long double;
ll ILL=1167167167167167167;
const int INF=2100000000;
const ll mod=998244353;
#define rep(i,a) for (ll i=0;i<a;i++)
#define all(p) p.begin(),p.end()
template<class T> using _pq = priority_queue<T, vector<T>, greater<T>>;
template<class T> ll LB(vector<T> &v,T a){return lower_bound(v.begin(),v.end(),a)-v.begin();}
template<class T> ll UB(vector<T> &v,T a){return upper_bound(v.begin(),v.end(),a)-v.begin();}
template<class T> bool chmin(T &a,const T &b){if(a>b){a=b;return 1;}else return 0;}
template<class T> bool chmax(T &a,const T &b){if(a<b){a=b;return 1;}else return 0;}
template<class T> void So(vector<T> &v) {sort(v.begin(),v.end());}
template<class T> void Sore(vector<T> &v) {sort(v.begin(),v.end(),[](T x,T y){return x>y;});}
void yneos(bool a){if(a) cout<<"Yes\n"; else cout<<"No\n";}
template<class T> void vec_out(vector<T> &p){for(int i=0;i<(int)(p.size());i++){if(i) cout<<" ";cout<<p[i];}cout<<"\n";}
//https://kazuma8128.hatenablog.com/entry/2018/05/31/144519
namespace po167{
long long rev(long long a,long long M){
a=(a%M+M)%M;
long long D=M-2;
long long ans=1;
while(D){
if(D&1) ans=(ans*a)%M;
a=(a*a)%M;
D>>=1;
}
return ans;
}
void and_fwt(vector<long long> &f,long long MOD){
int n=f.size();
for(int i=1;i<n;i<<=1){
for(int j=0;j<n;j++){
if((j&i)==0){
f[j]=(f[j]+f[j|i])%MOD;
}
}
}
}
void and_ifwt(vector<long long> &f,long long MOD){
int n=f.size();
for(int i=1;i<n;i<<=1){
for(int j=0;j<n;j++){
if((j&i)==0){
f[j]=(f[j]+MOD-f[j|i])%MOD;
}
}
}
}
std::vector<long long> and_convolution(std::vector<long long> p,std::vector<long long> q,long long MOD){
int n=p.size();
and_fwt(p,MOD),and_fwt(q,MOD);
for(int i=0;i<n;i++) p[i]=(p[i]*q[i])%MOD;
and_ifwt(p,MOD);
for(int i=0;i<n;i++) p[i]=(p[i]%MOD+MOD)%MOD;
return p;
}
std::vector<long long> or_convolution(std::vector<long long> p,std::vector<long long> q,long long MOD){
std::reverse(p.begin(),p.end());
std::reverse(q.begin(),q.end());
p=and_convolution(p,q,MOD);
std::reverse(p.begin(),p.end());
return p;
}
template <typename T>
void xor_fwt(vector<T>& f,long long MOD) {
int n = f.size();
for (int i = 1; i < n; i <<= 1) {
for (int j = 0; j < n; j++) {
if ((j & i) == 0) {
T x = f[j], y = f[j | i];
f[j]=(x+y)%MOD,f[j|i]=(x-y)%MOD;
}
}
}
}
template <typename T>
void xor_ifwt(vector<T>& f,long long MOD) {
int n = f.size();
long long half=rev(2,MOD);
for (int i = 1; i < n; i <<= 1) {
for (int j = 0; j < n; j++) {
if ((j & i) == 0) {
T x = f[j], y = f[j | i];
f[j] = ((x+y)*half)%MOD,f[j|i]=(((x-y+MOD)%MOD)*half)%MOD;
}
}
}
}
std::vector<long long> xor_convolution(std::vector<long long> p,std::vector<long long> q,long long MOD){
xor_fwt(p,MOD),xor_fwt(q,MOD);
for(int i=0;i<(int)(p.size());i++){
p[i]=(p[i]*q[i])%MOD;
p[i]=(p[i]+MOD)%MOD;
}
xor_ifwt(p,MOD);
return p;
}
}
using po167::and_convolution;
using po167::or_convolution;
using po167::xor_convolution;
ll jyo(ll x,ll y,ll z){
ll H=y; //ここから
ll a=1,b=(x%z+z)%z,c=1;
while(H>0){
a*=2;
if(H%a!=0){
H-=a/2;
c*=b;
c%=z;
}
b*=b;
b%=z;
} //ここまで
return c;
}
void solve();
// oddloop
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t=1;
//cin>>t;
rep(i,t) solve();
}
void solve(){
int N;
cin>>N;
vector<ll> A(N+1);
ll S=0;
rep(i,N+1) cin>>A[i],S+=A[i];
rep(i,N+1) A[i]=(A[i]*jyo(S,mod-2,mod))%mod;
ll p=A[0];
A[0]=0;
ll D=N+1;
ll M=32;
ll E=M*M;
while(D<E) A.push_back(0),D++;
ll ans=0;
rep(i,E){
if(i==0) continue;
auto B=A;
B[i]=0;
po167::xor_fwt(B,mod);
rep(j,E){
//B[j]=(B[j]*jyo(M,mod-2,mod))%mod;
//cout<<i<<" "<<j<<" "<<(B[j]*6)%mod<<"\n";
if(B[j]==0) continue;
B[j]=(B[j]*(jyo(1-B[j],mod-2,mod)))%mod;
B[j]=(B[j]*p)%mod;
}
po167::xor_ifwt(B,mod);
ans=(ans+B[i])%mod;
/*cout<<i<<"\n";
rep(j,E) cout<<(B[j]*420)%mod<<" ",tmp+=B[j];
cout<<"\n";
cout<<((tmp%mod+mod)*15)%mod<<"\n";*/
}
cout<<(((ans%mod)+mod))%mod<<"\n";
}
/*
op: x times -> p(1-p)^x
\sum_{x=1}^{\infty} p(H_i)^x
=p/(1-H_i)
*/
potato167