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

news/2024/7/5 5:03:38

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1773

参考1:FWT讲解 https://www.cnblogs.com/RabbitHu/p/9182047.html

参考2:题解 https://www.cnblogs.com/ivorysi/p/9178577.html

(令$\oplus$表示异或)

设$dp[i][j]$表示第$i$天$j$编号城市货物数。

因为只有$i \oplus j$的答案有一个1才能转移,所以$i\oplus j=2^k$

根据异或的性质变成$i\oplus 2^k=j$。

想办法利用它把转移方程写成卷积的形式。

设$b[2^i]=1$,其余都是$0$,于是就有:

$dp[i][j]=dp[i-1][j]+\sum_{a\oplus k=j}dp[i-1][a]*b[k]$

你会发现把$dp$递归展开之后实际上就是一个卷积套卷积……套$t$次的过程,$FWT$运算加快速幂即可。

注意读入输出优化。

#include<map>
#include<cmath>
#include<stack>
#include<queue>
#include<cstdio>
#include<cctype>
#include<vector>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=1<<20;
const int p=1e9+7;
const int inv=500000004;
inline int read(){int X=0,w=0;char ch=0;while(!isdigit(ch)){w|=ch=='-';ch=getchar();}while(isdigit(ch))X=(X<<3)+(X<<1)+(ch^48),ch=getchar();return w?-X:X;
}
void write(int x){if(x>9)write(x/10);putchar('0'+x%10);
}
inline int add(int x,int y){x+=y;if(x>=p)x-=p;return x;
}
inline int sub(int x,int y){x-=y;if(x<0)x+=p;return x;
}
void FWT(int a[],int n,int on){for(int i=1;i<n;i<<=1){for(int j=0;j<n;j+=(i<<1)){for(int k=0;k<i;k++){int u=a[j+k],t=a[j+k+i];a[j+k]=add(u,t);a[j+k+i]=sub(u,t);if(on==-1){a[j+k]=(ll)a[j+k]*inv%p;a[j+k+i]=(ll)a[j+k+i]*inv%p;}}}}
}
int qpow(int k,int n){int res=1;while(n){if(n&1)res=(ll)res*k%p;k=(ll)k*k%p;n>>=1;}return res;
}
int n,t,m,a[N],b[N];
int main(){n=read(),t=read(),m=1<<n;for(int i=0;i<m;i++)a[i]=read();for(int i=0;i<m;i++){if(i-(i&-i)==0)b[i]=1;}FWT(a,m,1);FWT(b,m,1);for(int i=0;i<m;i++)a[i]=(ll)a[i]*qpow(b[i],t)%p;FWT(a,m,-1);for(int i=0;i<m;i++){write(a[i]);putchar(' ');}puts("");return 0;
}

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+

+++++++++++++++++++++++++++++++++++++++++++

转载于:https://www.cnblogs.com/luyouqi233/p/9190262.html


http://lihuaxi.xjx100.cn/news/272531.html

相关文章

《评人工智能如何走向新阶段》后记(再续18)

由AI科技大本营下载273.人工智能与人脑智能 近年来人工智能取得了巨大进步&#xff0c;受人脑神经元调节机制启发的人工智能新颖算法层出不穷&#xff01;但人工智能离人脑智能&#xff08;或称人类智能&#xff09;还差得很远&#xff0c;而人脑&#xff08;神经元&#xff0…

2020 Top10 计算机视觉论文总结:论文,代码,解读,还有demo视频!

点击上方“视学算法”&#xff0c;选择加"星标"或“置顶”重磅干货&#xff0c;第一时间送达作者丨louisfb01来源丨AI公园编辑丨极市平台尽管今年世界上发生了这么多事情&#xff0c;我们还是有机会看到很多惊人的研究成果。特别是在人工智能更精确的说是计算机视觉领…

Pygame Rect区域位置(图解)

Rect&#xff08;rectangle&#xff09;指的是矩形&#xff0c;或者长方形&#xff0c;在 Pygame 中我们使用 Rect() 方法来创建一个指定位置&#xff0c;大小的矩形区域。函数的语法格式如下&#xff1a; rect pygame.Rect(left,top,width,height) Rect 表示的区域必须位于…

springboot集成普罗米修斯

点击上方“方志朋”&#xff0c;选择“设为星标”回复”666“获取新整理的面试文章Prometheus 是一套开源的系统监控报警框架。它由工作在 SoundCloud 的 员工创建&#xff0c;并在 2015 年正式发布的开源项目。2016 年&#xff0c;Prometheus 正式加入 Cloud Native Computing…

Python中相见恨晚的技巧(记得收藏)

话不多说&#xff0c;直接开干&#xff0c;攒了很久&#xff01; 1. 交换变量值 这个应该比较简单&#xff0c;但是日常用很容易忽略。 a, b 5, 10 print(a, b) //5, 10 a, b b, a print(a, b) //10, 5 | 2. 将列表中所有元素组合成字符串 这个其实也是一个基本语法…

Redis基础、应用、第三方支持组件总结

这段时间一直在研究学习Redis的相关知识&#xff0c;现在大概做下总结吧首先&#xff0c;Redis的基础方面&#xff0c;不说配置&#xff0c;就单单说下Redis数据类型&#xff1a;Redis 五大数据类型有String 类型&#xff0c;Hash 类型&#xff0c;List 类型&#xff0c;Set 类…

预训练模型ProphetNet:根据未来文本信息进行自然语言生成

作者 | 刘大一恒、齐炜祯、晏宇、宫叶云、段楠、周明来源 | 微软研究院AI头条&#xff08;ID:MSRAsia&#xff09;编者按&#xff1a;微软亚洲研究院提出新的预训练模型 ProphetNet&#xff0c;提出了一种新的自监督学习目标——同时预测多个未来字符&#xff0c;在序列到序列的…

nodejs安装、配置及开发工具

学了node一段时间&#xff0c;但是node的安装还是有一点迷糊。今天新换电脑&#xff0c;所以&#xff0c;需要从头开始&#xff0c;发现node的安装还是不顺畅&#xff0c;这篇随笔是之前学的时候写&#xff0c;但是今天再打开看的时候&#xff0c;发现其他好像没有什么内容&…