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

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

时间: 2024-10-14 11:32:46

51NOD 1773:A国的贸易——题解的相关文章

51nod1773 A国的贸易

51nod1773 http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1773 #include<cstdio> #include<map> #define gc getchar() const int mod=1e9+7,inv2=(mod+1)>>1; int a[1<<21],b[1<<21]; int n,m; inline int fwt(int *a,int d

9.16考试 第一题 X国的军队题解

这道题总体来看还是比较满意的.连想带打不超过半个小时,打了不到当时基本读懂后就感觉是贪心,但贪什么很重要,当时一开始想的是贪心死亡人数,从小到大搞,然后自己造了几个小数据,还好WA了,然后又列了一个式子,直接证明了贪心.式子如下: 我们设有两个据点,一个A=x1,B=y1,另一个A=x2,b=y2. 若x1-y1>x2-y2 则先打A所需为 x1+(x2-(x1-y1))=x2+y1,先打B为x2+(x1-(x2-y2))=x1+y2. 由上式可知x1+y2>x2+y1,所以应当先打A. 其余

51nod 1277 字符串中的最大值

题目链接 51nod 1277 字符串中的最大值 题解 对于单串,考虑多串的fail树,发现next数组的关系形成树形结构 建出next树,对于每一个前缀,他出现的次数就是他子树的大小 代码 #include<cstdio> #include<cstring> #include<algorithm> inline int read() { int x = 0,f = 1; char c = getchar(); while(c < '0' || c > '9

大数据分析,利用向外扩展技术深入挖掘商业价值

导语:大数据分析技术的价值在企业领域已经非常明确.充分利用良好信息的能力一直是摆在IT部门面前的重要难题与挑战.现在我们已经拥有了足以解决这一难题的工具,接下来要做的就是想办法使其为自己服务了. 方方面面的发展改进已经让从半结构化数据中获取有价值信息成为可能.以Hadoop为代表的新型解决方案在构建层面就充分考虑到了要如何适应跨商用服务器集群的分布式运行环境. 大数据:以需求为导向的审视角度 新型分析工具与极大丰富的处理能力为我们敞开了一道大门,如今企业已经能够借此对庞大的业务及外部数据加以审视

微观经济学(九):市场与福利 - 应用:国际贸易

前言 在第三节中,我们介绍了国际贸易的好处,各国都可以从贸易中获益,因为贸易使每个国家都可以专门从事自己最擅长的活动.但是在那里的分析是不完善的,它没有解释在国际市场上如何实现这种贸易的好处,或者这些好处如何在各个经济参与者之间进行分配,在本节中,将详细介绍这些内容. 决定贸易的因素 没有贸易时的均衡 假设我们国家当前要贸易的产品是纺织品,国内纺织品市场的供需图如下: 世界价格和比较优势 现在我们要查看我们到底是应该出口还是进口纺织品. 我们把世界市场上通行的价格称为世界价格(world pri

一带一路电子签名服务加速一带一路国家经济发展

--沃通CA受邀在第19届欧洲电子签名与可信服务大会发表演讲 沃通CEO王高华先生受邀出席于2019年5月29日-30日在波兰主办的第十九届欧洲电子签名论坛大会(EFPE 2019),并在会上用英文发表了演讲,演讲题目为"一带一路电子签名服务(eSigning Service for the Belt and Road)".王高华先生向欧洲CA.一带一路国家CA.电子签名服务提供商和相关产品提供商介绍了沃通全资子公司—密信技术有限公司推出的“我签”电子签名服务如何免费为欧洲和一带一路国

宏观经济

微观经济针对市场主体而言,宏观经济针对整个社会而言 理论 1936年英国凯恩斯<<就业,利息与货币通论>>出版,标志着现代宏观经济的建立,提出了"看得见的手" 亚当.斯密<>提出"看不见的手" 菲利普斯曲线是用来表示失业与通货膨胀之间交替关系的曲线 由新西兰经济学家威廉.菲利普斯与1958年在<<1861-1957年英国失业和货币工资变动率之间的关系>>一文中最先提出. 宏观调控 主体:国家机关 主要是权力

最优贸易(codevs 1173)题解

[问题描述] C 国有n 个大城市和m 条道路,每条道路连接这n 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这m 条道路中有一部分为单向通行的道路,一部分为双向通行的道路,双向通行的道路在统计条数时也计为1 条.C 国幅员辽阔,各地的资源分布情况各不相同,这就导致了同一种商品在不同城市的价格不一定相同.但是,同一种商品在同一个城市的买入价和卖出价始终是相同的.商人阿龙来到 C 国旅游.当他得知同一种商品在不同城市的价格可能会不同这一信息之后,便决定在旅游的同时,利用商品在不

[NOIP2009提高组]最优贸易 tarjan题解

今天刚刚学会了用tarjan写缩点(以前用两遍dfs写的),此题调了我很久,需要考虑的情况有些多,但是做出来还是挺开心的. 首先通过tarjan缩点,之后要干的事情就是计算答案. 答案有两种情况,一是在一个联通块中买进卖出,二是在一个联通块中买入,但在另外一个联通块中卖出.但是需要注意的是,以上两种情况中的联通块需要满足起点可以到达它,它也可以到达终点,并且不在一个联通块中时,买进必在卖出前. 代码中的dp(x)记录的是从起点到现在买进价最低的,每次只要用当前最大价钱减去这个值,再去和ans做比