[FWT] 51nod 算法马拉松26 A. A国的贸易
2017-07-21 21:37
190 查看
题意
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取模。
n<=20 t<=10^9
题解
当时还不知道FWT时去做这题,想了快2h……后来才得知是新算法……其实很简单,相当于二进制取反某一位后的编号都可以运过来,就是异或一个2x。
所以我们构造一个多项式,其中二的次幂项都为1,其他为0。异或下的卷积卷一次就相当于运了一天。
FWT,然后快速幂就好了。
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef long long LL; const LL maxn=1500005, MOD=1000000007, Inv=(MOD+1)/2; inline char gc(){ static char buf[100000],*p1=buf,*p2=buf; return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++; } inline int getint(){ char ch=gc(); int res=0; while(!('0'<=ch&&ch<='9')) ch=gc(); while('0'<=ch&&ch<='9') res=(res<<3)+(res<<1)+ch-'0', ch=gc(); return res; } int n,K,a[maxn],b[maxn]; void FWT(int a[],int n,int _k){ for(int m=2;m<=n;m<<=1) for(int i=0;i<=n-1;i+=m) for(int j=0;j<=m/2-1;j++){ int t0=a[i+j], t1=a[i+j+m/2]; if(_k==1) a[i+j]=(t0+t1)%MOD, a[i+j+m/2]=(t0+MOD-t1)%MOD; else a[i+j]=(LL)(t0+t1)*Inv%MOD, a[i+j+m/2]=(LL)(t0-t1+MOD)*Inv%MOD; } } int Pow(int a,int b){ LL res=1; for(LL w=a%MOD;b;w=w*w%MOD,b>>=1) if(b&1) (res*=w)%=MOD; return res; } void write(int x){ if(x>=10) write(x/10); putchar('0'+x%10); } int main(){ freopen("51nod1773.in","r",stdin); freopen("51nod1773.out","w",stdout); scanf("%d%d",&n,&K); n=1<<n; for(int i=0;i<=n-1;i++) a[i]=getint(); b[0]=1; for(int i=1;i<=n-1;i<<=1) b[i]=1; FWT(a,n,1); FWT(b,n,1); for(int i=0;i<=n-1;i++) a[i]=(LL)a[i]*Pow(b[i],K)%MOD; FWT(a,n,-1); for(int i=0;i<=n-1;i++) write(a[i]),putchar(' '); return 0; }
相关文章推荐
- [FWT] 51Nod 算法马拉松26 A A国的贸易
- [最短路 主席树 Hash] 51Nod 算法马拉松26 E Travel
- [暴力 乱搞] 51Nod 1501 算法马拉松19 D 石头剪刀布威力加强版
- 【51Nod 1616】【算法马拉松 19B】最小集合
- 51nod算法马拉松28划水记
- 【51nod】算法马拉松4 F 移数字 【快速求N!%P】【FFT】
- 51Nod 算法马拉松23
- [特征根法 || 高斯消元] 51Nod 1653 算法马拉松19 E 夹克赌坊
- 51nod 算法马拉松11 D 计算
- 【51nod 算法马拉松19 C】 集合对
- 【51Nod 1674】【算法马拉松 19A】区间的价值 V2
- [排列组合 + 分段打表] 51nod 算法马拉松25 A. 二分答案
- 【51NOD 1501】【51NOD 算法马拉松19】石头剪刀布威力加强版
- 51nod算法马拉松20
- 51nod 算法马拉松12 逛街(treap)
- 51nod 算法马拉松 天堂里的游戏
- 51Nod-算法马拉松23 B 谷歌的恐龙 [概率期望]【数学】
- 51Nod 算法马拉松18 复杂度分析 二进制按位累计代价
- 「51nod 算法马拉松31C」彩色树
- 【51nod 算法马拉松19 A】区间的价值 V2