基准时间限制:2 秒 空间限制:524288 KB 分值: 40 
A国是一个神奇的国家。

这个国家有 2n 个城市,每个城市都有一个独一无二的编号 ,编号范围为0~2n-1。

A国的神奇体现在,他们有着神奇的贸易规则。
当两个城市u,v的编号满足calc(u,v)=1的时候,这两个城市才可以进行贸易(即有一条边相连)。
而calc(u,v)定义为u,v按位异或的结果的二进制表示中数字1的个数。
ex:calc(1,2)=2         ——> 01 xor 10 = 11
       calc(100,101)=1 ——> 0110,0100 xor 0110,0101 = 1
       calc(233,233)=0 ——> 1110,1001 xor 1110,1001 = 0
每个城市开始时都有不同的货物存储量。
而贸易的规则是:
每过一天,可以交易的城市之间就会交易一次。
在每次交易中,当前城市u中的每个货物都将使所有与当前城市u有贸易关系的城市货物量 +1 。
请问 t 天后,每个城市会有多少货物。
答案可能会很大,所以请对1e9+7取模。

 
Input
第一行两个正整数 n , t,意义如题。
第二行 2^n 个非负整数,第 i 个数表示编号为 i-1 的城市的初始货物存储量。
n<=20  t<=10^9
Output
输出一行 2^n 个非负整数。
第 i 个数表示过了 t 天后,编号为 i-1 的城市上的货物数量对 1e9+7 取模的结果。
Input示例
样例1:
3 2
1 2 3 4 5 6 7 8
样例2:
1 1
0 1
Output示例
样例1:
58 62 66 70 74 78 82 86
样例2:
1 1

动态规划 FWT

根据题意一天到下一天的转移有两种:

  1、从f[x]转移到f[x](累加自身)

  2、从f[x]转移到f[x Xor 2^i]

转化一下视角,从上一天到这天的转移有两种:

  1、从f[x Xor 2^0]到f[x]

  2、从f[x Xor 2^i]到f[x]

显然,我们构造一个数组B,使得B只有0和2的幂次位为1,其他位为0,和原数组做异或卷积就能得到一次转移的结果。

加个快速幂就可以了。

需要输出优化。

博主不知道是有多困(chun),才能做到FWT的时候只变换原数组不变换B数组就直接乘,还如同星际选手一般地反复在其他地方找bug……

 #include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
using namespace std;
const int mod=1e9+;
const int inv2=;
const int mxn=;
int read(){
int x=,f=;char ch=getchar();
while(ch<'' || ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>='' && ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
void write(int x){
if(x>)write(x/);
putchar(''+x%);
return;
}
int N,len;
int a[mxn],b[mxn];
void FWT(int *a){
for(int i=;i<N;i<<=){
int p=i<<;
for(int j=;j<N;j+=p){
for(int k=;k<i;k++){
int x=a[j+k],y=a[j+k+i];
a[j+k]=(x+y);if(a[j+k]>=mod)a[j+k]-=mod;
a[j+k+i]=(x-y);if(a[j+k+i]<)a[j+k+i]+=mod;
}
}
}
return;
}
void UTF(int *a){
for(int i=;i<N;i<<=){
int p=i<<;
for(int j=;j<N;j+=p){
for(int k=;k<i;k++){
int x=a[j+k],y=a[j+k+i];
a[j+k]=(x+y)*(LL)inv2%mod;
a[j+k+i]=(x-y)*(LL)inv2%mod;
}
}
}
return;
}
int ksm(int a,int k){
int res=;
while(k){
if(k&)res=(LL)res*a%mod;
a=(LL)a*a%mod;
k>>=;
}
return res;
}
int n,m,T;
int main(){
int i,j;
n=read();T=read();
m=<<n;
for(N=,len=;N<=m;N<<=)len++;
for(i=;i<m;i++)a[i]=read();
for(i=;i<m;i++){
if(i-(i&-i)==)b[i]=;
}
FWT(a);FWT(b);
for(i=;i<N;i++)a[i]=(LL)a[i]*ksm(b[i],T)%mod;
UTF(a);
for(i=;i<m;i++){
// printf("%d ",(a[i]+mod)%mod);
write((a[i]+mod)%mod);
putchar(' ');
}
return ;
}
基准时间限制:2 秒 空间限制:524288 KB 分值: 40 难度:4级算法题
 收藏
 关注
A国是一个神奇的国家。

这个国家有 2n 个城市,每个城市都有一个独一无二的编号 ,编号范围为0~2n-1。

A国的神奇体现在,他们有着神奇的贸易规则。
当两个城市u,v的编号满足calc(u,v)=1的时候,这两个城市才可以进行贸易(即有一条边相连)。
而calc(u,v)定义为u,v按位异或的结果的二进制表示中数字1的个数。
ex:calc(1,2)=2         ——> 01 xor 10 = 11
       calc(100,101)=1 ——> 0110,0100 xor 0110,0101 = 1
       calc(233,233)=0 ——> 1110,1001 xor 1110,1001 = 0
每个城市开始时都有不同的货物存储量。
而贸易的规则是:
每过一天,可以交易的城市之间就会交易一次。
在每次交易中,当前城市u中的每个货物都将使所有与当前城市u有贸易关系的城市货物量 +1 。
请问 t 天后,每个城市会有多少货物。
答案可能会很大,所以请对1e9+7取模。

 
Input
第一行两个正整数 n , t,意义如题。
第二行 2^n 个非负整数,第 i 个数表示编号为 i-1 的城市的初始货物存储量。
n<=20  t<=10^9
Output
输出一行 2^n 个非负整数。
第 i 个数表示过了 t 天后,编号为 i-1 的城市上的货物数量对 1e9+7 取模的结果。
Input示例
样例1:
3 2
1 2 3 4 5 6 7 8
样例2:
1 1
0 1
Output示例
样例1:
58 62 66 70 74 78 82 86
样例2:
1 1

51nod1773 A国的贸易的更多相关文章

  1. 51Nod1773 A国的贸易 多项式 FWT

    原文链接https://www.cnblogs.com/zhouzhendong/p/51Nod1773.html 题目传送门 - 51Nod1773 题意 给定一个长度为 $2^n$ 的序列,第 $ ...

  2. 【51Nod1773】A国的贸易 解题报告

    [51Nod1773]A国的贸易 Description 给出一个长度为 \(2^n\) 的序列,编号从\(0\)开始.每次操作后,如果 \(i\) 与 \(j\) 的二进制表示只差一位则第 \(i\ ...

  3. [51Nod 1773] A国的贸易

    [51Nod 1773] A国的贸易 题目描述 A国是一个神奇的国家. 这个国家有 2n 个城市,每个城市都有一个独一无二的编号 ,编号范围为0~2n-1. A国的神奇体现在,他们有着神奇的贸易规则. ...

  4. 【51Nod1773】A国的贸易 FWT+快速幂

    题目描述 给出一个长度为 $2^n$ 的序列,编号从0开始.每次操作后,如果 $i$ 与 $j$ 的二进制表示只差一位则第 $i$ 个数会加上操作前的第 $j$ 个数.求 $t$ 次操作后序列中的每个 ...

  5. 【51nod】1773 A国的贸易

    题解 FWT板子题 可以发现 \(dp[i][u] = \sum_{i = 0}^{N - 1} dp[i - 1][u xor (2^i)] + dp[i - 1][u]\) 然后如果把异或提出来可 ...

  6. 51NOD 1773:A国的贸易——题解

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1773 参考1:FWT讲解 https://www.cnblogs.com ...

  7. NOIP2009最优贸易[spfa变形|tarjan 缩点 DP]

    题目描述 C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个 城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分 为双向通行的道路 ...

  8. 【NOIP2009 T3】 最佳贸易 (双向SPFA)

    C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分为双向通行的道路,双向通行的道 ...

  9. [NOIP2009] 提高组 洛谷P1073 最优贸易

    题目描述 C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个 城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分 为双向通行的道路 ...

随机推荐

  1. 小程序获取access_token

    <?php //小程序appid $appid = 'wx79d7c348d19f010c'; //小程序 APPSecret 密钥 $appsecret = 'd624aca86d0350ee ...

  2. get_list_by_where

    /** * 查询数据 * @param $param * @param bool $get_rows 或者总数 * @param bool $get_one 或者一条记录 * @param bool ...

  3. Web前端JQuery基础

    JQuery知识汇总 一.关于Jquery简介          jQuery是一个快速.简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(或JavaS ...

  4. linux 内核态调试函数BUG_ON()[转]

    一些内核调用可以用来方便标记bug,提供断言并输出信息.最常用的两个是BUG()和BUG_ON(). 当被调用的时候,它们会引发oops,导致栈的回溯和错误信息的打印.为什么这些声明会导致 oops跟 ...

  5. C#和Java在多态情况下对成员访问的比较

    本文简单比较一下两种语言在里氏替换原则下,父类引用变量访问成员时的访问结果: 如果有两个类,如Person与Student,后者继承了前者,而且子类与父类有重名成员,当Person p = new S ...

  6. mysql导出/导入表结构以及表数据

    导出: 命令行下具体用法如下:  mysqldump -u用戶名 -p密码 -d 数据库名 表名 脚本名; 1.导出数据库为dbname的表结构(其中用戶名为root,密码为dbpasswd,生成的脚 ...

  7. utuntu下安装pip&pip3

    在utuntu下建议不要使用apt-get install 安装pip,会出现很多问题. 建议使用如下方式安装: wget https://bootstrap.pypa.io/get-pip.py - ...

  8. js简易随机打乱数组方法

    打乱随机数算法很多,不过看这个还挺简便的,记录下来. function shuffle(a) { var len = a.length; for(var i=0;i<len;i++){ var ...

  9. HDU2486_A simple stone game

    这个题目是这样的,一堆石子有n个,首先第一个人开始可以去1-(n-1)个,接下来两人轮流取石子,每个人可取的石子数必须是一个不超过上一次被取的石子的K倍的整数. 现在求对于一堆数量为n的石子是否为必胜 ...

  10. 编写高效SQL语句(转)

    转至http://blog.csdn.net/u012150457/article/details/41846299 一.编写高效SQL语句 1) 选择最有效的表名顺序(仅适用于RBO模式) ORAC ...