基准时间限制: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. SSL 重点SSL会话步骤

    SSL.TLS协议 在wiki百科查看下,两者的区别 实现SSL协议的软件 OpenSSL开源软件 SSL会话步骤 1:客户端向服务端索取CA证书,然后验证证书   2:客户端与服务端约定一个通信中使 ...

  2. css声明的优先级

    选择器的特殊性 选择器的特殊性由选择器本身的组件确定,特殊性值表述为4个部分,如0,0,0,0,0 一个选择器的具体特殊性如下确定 1.对于选择器给定的ID属性值,加0,1,0,0 2.对于选择器中给 ...

  3. Mac & how to uninstall LANDesk

    Mac & how to uninstall LANDesk http://eddiejackson.net/wp/?p=9036 https://community.ivanti.com/d ...

  4. inno setup 打包exe程序

    inno setup 用于打包生成安装程序, 是通过的一个脚本 可以将 exe 执行文件以安装的形式,解压,添加依赖,创建快捷方式. 例如,我们写了个winform,我们怎么通过安装的形式,给客户的机 ...

  5. luogu 1344 追查坏牛奶(最小割)

    第一问求最小割. 第二问求割边最小的最小割. 我们直接求出第二问就可以求出第一问了. 对于求割边最小,如果我们可以把每条边都附加一个1的权值,那么求最小割是不是会优先选择1最少的边呢. 但是如果直接把 ...

  6. 关于setInterval()定时

    最近项目中,遇到个需求就是获取停车场剩余车位数量,想是通过ajax定时抓取接口数据来实现(本想通过SignalR),但是项目本身直供少数人使用,感觉定时ajax可以满足 下面上代码 var handl ...

  7. [十三]SpringBoot 之 过滤器(Filter)和监听器(Listener)

    过滤器(Filter)和 监听器(Listener)的注册方法和 Servlet 一样,不清楚的可以查看下上一篇文章 代码示例 package me.shijunjie.filter; import ...

  8. 洛谷 P3258 [JLOI2014]松鼠的新家

    树剖,裸题,鉴定完毕. 我是题面 读完题,恩,树剖,裸题,没劲. 处理很简单,既然每到一个房间吃一块糖,那么就在每条路径上的每个房间放一颗糖,但是每条路径的终点也就是下一条路径的起点,在这里只能加一次 ...

  9. castle activerecord 学习过程出现的问题

    优点: 1.CRUD:代码简洁 2.不用配置map 3.自带事务方便 4.自带IOC 5.自带 数据有效性验证 缺点: 1.自增长(Oracle 一直提示序号不存在,有空继续尝试) 2.多条件,直接用 ...

  10. BMP格式图像读取与存储

    全局变量: 1 #include "stdafx.h" #include <windows.h> /*BMP位图数据是4字节对齐*/ #define WIDTHBYTE ...