题目

  点这里看题目。

分析

  设\(count(x)\)为\(x\)的二进制中\(1\)的个数。因此\(f(u,v)=count(u\oplus v)\)

  看一看每次转移,我们发现最不友好的东西就是\(f(u,v)\),因此我们得想办法把它从我们的计算中丢掉。

  发现对于\([0,n)\)中的所有数,两两异或之后不会超过\(n\)。并且对于一个固定的数\(x\),其\(count(x)\)是不会变的。因此我们考虑将\(b\)数组转存出来:

\[a[i]=b[count(i)]
\]

  因此有:

\[e[u]=\sum_v a[u\oplus v]e[v]
\]

  考虑改变枚举顺序:

\[\begin{aligned}
e[u] &=\sum_v a[u\oplus v]e[v]\\
&=\sum_{i=0}^ma[i]\sum_{u\oplus v=i}e[v]\\
&=\sum_{i=0}^m a[i]\sum_{v\oplus i=u}e[v]\\
&=\sum_{v\oplus i=u}a[i]e[v]\end{aligned}
\]

  因此每次转移都是一个异或卷积的形式,可以用 FWT 优化一发。由于需要转移\(t\)次,还可用快速幂。 FWT 只需要在初始和最后做,中途快速幂不需要。时间是\(O(mn + n\log_2t)\)。

  这里还有一问题。由于本题给的是任意模数,可能不存在\(2\)逆元。

  众所周知, 异或 FWT 还有一种版本,也就是像 FFT 一样,正变换和逆变换大部分一样,但是逆变换会在最后除掉向量长度(事实上 FWT 和 FFT 有很多相似处,可以在 K 进制 FWT 中了解到)

  因此我们可以使用上述的 FWT 。但是这里还有问题,\(p\)可能也没有\(n\)的逆元。根据同余基本性质:

\[a\equiv b\pmod p\Leftrightarrow \frac a d\equiv \frac b d\pmod {\frac p d}(d|\gcd\{a,b,m\})
\]

  我们把\(p\)扩大\(n\)倍之后就可以直接除得正确答案了。

  最后一个问题,\(n\times p\)是\(10^{15}\)的,如果直接乘法会溢出(什么? __int128 ?)。因此我们需要用 long double 来模拟取模(龟速乘太慢了)。

代码

#include <cstdio>

typedef long long LL;
typedef long double LB; const int MAXM = 25, MAXN = 1.5e6 + 5; template<typename _T>
void read( _T &x )
{
x = 0;char s = getchar();int f = 1;
while( s > '9' || s < '0' ){if( s == '-' ) f = -1; s = getchar();}
while( s >= '0' && s <= '9' ){x = ( x << 3 ) + ( x << 1 ) + ( s - '0' ), s = getchar();}
x *= f;
} template<typename _T>
void write( _T x )
{
if( x < 0 ){ putchar( '-' ); x = ( ~ x ) + 1; }
if( 9 < x ){ write( x / 10 ); }
putchar( x % 10 + '0' );
} LL E[MAXN], C[MAXN];
int B[MAXM];
LL T, mod;
int N, M; int lowbit( const int &x ) { return x & ( -x ); }
LL fix( const LL a ) { return ( a % mod + mod ) % mod; }
int count( int x ) { int ret = 0; while( x ) ret ++, x -= lowbit( x ); return ret; } LL mul( const LL a, const LL b ) { return fix( a * b - ( LL ) ( ( LB ) a / mod * b ) * mod ); } void FWT( LL *f, const int mode )
{
LL t1, t2;
for( int s = 2 ; s <= N ; s <<= 1 )
for( int i = 0, t = s >> 1 ; i < N ; i += s )
for( int j = i ; j < i + t ; j ++ )
{
t1 = f[j], t2 = f[j + t];
f[j] = ( t1 + t2 ) % mod, f[j + t] = fix( t1 - t2 );
}
if( ~ mode ) return ;
for( int i = 0 ; i < N ; i ++ ) f[i] /= N;
} void mul( LL *ret, LL *mult )
{
for( int i = 0 ; i < N ; i ++ )
ret[i] = mul( ret[i], mult[i] );
} int main()
{
read( M ), read( T ), read( mod );
N = 1 << M, mod *= N;
for( int i = 0 ; i < N ; i ++ ) read( E[i] );
for( int i = 0 ; i <= M ; i ++ ) read( B[i] );
for( int i = 0 ; i < N ; i ++ ) C[i] = B[count( i )];
FWT( E, 1 ), FWT( C, 1 );
while( T )
{
if( T & 1 ) mul( E, C );
mul( C, C ), T >>= 1;
}
FWT( E, -1 );
for( int i = 0 ; i < N ; i ++ ) write( E[i] ), puts( "" );
return 0;
}

[CF453D]Little Pony and Elements of Harmony的更多相关文章

  1. 【CF453D】 Little Pony and Elements of Harmony(FWT)

    题面 传送门 设\(a\)的递推公式为 \[a_i=\sum_ja_jb[count(i\oplus j)]\] 其中\(\oplus\)为异或,\(count(i)\)表示\(i\)的二进制中\(1 ...

  2. 453D Little Pony and Elements of Harmony

    传送门 分析 我们可以将所有的b[i^j]直接对应到b[f(i^j)]上 于是显然可以fwt 我们对b进行t次fwt之后直接将答案与e0卷起来即可 注意由于模数不确定,我们可以将模数扩大$2^m$然后 ...

  3. CF453(Div1 简单题解)

    A .Little Pony and Expected Maximum pro:给定M,N,表示一个M面的骰子,甩N次,问出现的最大的数的期望. sol:容斥,f(i)表示最大数<=i的期望,那 ...

  4. CF453B Little Pony and Harmony Chest (状压DP)

    CF453B CF454D Codeforces Round #259 (Div. 2) D Codeforces Round #259 (Div. 1) B D. Little Pony and H ...

  5. Codeforces Round #259 (Div. 2) D. Little Pony and Harmony Chest 状压DP

    D. Little Pony and Harmony Chest   Princess Twilight went to Celestia and Luna's old castle to resea ...

  6. Codeforces Round #259 (Div. 2) D

    D. Little Pony and Harmony Chest time limit per test 4 seconds memory limit per test 256 megabytes i ...

  7. codeforces Round #259(div2) D解决报告

    D. Little Pony and Harmony Chest time limit per test 4 seconds memory limit per test 256 megabytes i ...

  8. Codeforces 4538 (状态压缩dp)Little Pony and Harmony Chest

    Little Pony and Harmony Chest 经典状态压缩dp #include <cstdio> #include <cstring> #include < ...

  9. [CF453B]Little Pony and Harmony Chest

    [CF453B]Little Pony and Harmony Chest 题目大意: 给你一个长度为\(n(n\le100)\)的正整数序列\(A(A_i\le30)\),求一个正整数序列\(B\) ...

随机推荐

  1. utf8mb4复杂昵称问题

    wechat_ling wl_channel_consumer nickname wl_consumer nickname alter table wl_channel_consumer modify ...

  2. java 字符串转为list

     List<String> idList = Arrays.asList(irIds.split(",")); 

  3. byte值的问题

    byte值的问题 byte b1 = 127; byte b2 = (byte)128; //-128 byte b3 = (byte)129; //-127 byte b4 = (byte)130; ...

  4. 自动网络搜索(NAS)在语义分割上的应用(二)

    前言: 本文将介绍如何基于ProxylessNAS搜索semantic segmentation模型,最终搜索得到的模型结构可在CPU上达到36 fps的测试结果,展示自动网络搜索(NAS)在语义分割 ...

  5. linux高级管理第十二章--rsync

    实验部分 1.安装rsync 2.配置文件 3.配置密码 4.后续 5.为了测试,创建几个文件 配置实时同步 1.调整inotify内核参数 安装inotify-tools 测试同步 编写脚本 验证 ...

  6. Qt版本中国象棋开发(四)

    内容:走法产生 中国象棋基础搜索AI, 极大值,极小值剪枝搜索, 静态估值函数 理论基础: (一)人机博弈走法产生: 先遍历某一方的所有棋子,再遍历整个棋盘,得到每个棋子的所有走棋情况(效率不高,可以 ...

  7. [wordpress使用]001_环境安装

    Wordpress强大的可扩展性和易用性等功能,使得越来越多的人选择它来建立自己的博客和网站.那么新手朋友该如何入手呢,今天制作这个教程就是旨在帮助新手朋友快速入门,从而为今后WP建站打下坚实的基础. ...

  8. [256个管理学理论]003.鳄鱼法则(Alligator Principle)

    鳄鱼法则(Alligator Principle) 来自于大洋彼岸的让你看不懂的解释: 这是经济学交易技术法则之一,也叫“鳄鱼效应”,它的意思是:假定一只鳄鱼咬住你的脚,如果你用手去试图挣脱你的脚,鳄 ...

  9. python报错2

    缩进导致的报错 IndentationError: unindent does not match any outer indentation level NameError 命名错误 原因是: na ...

  10. Linux下db2V10.5命令行安装超详细图文教程(附下载地址)

    下载地址:https://pan.baidu.com/s/1GtF03x1FMF3IsGdSiBJu-g 提取码:8vfj 失效了发邮件:wells974@163.com 一.db2prereqche ...