bzoj千題計劃308:bzoj4589: Hard Nim(倍增FWT+生成函式)
#include<cstdio> #include<cstring> using namespace std; #define N 50001 const int mod=1e9+7; const int M=1<<16; int inv; int a[N]; int b[M+1]; void FWT(int *a,int n) { int x,y; for(int d=1;d<n;d<<=1) for(int m=d<<1,i=0;i<n;i+=m)for(int j=0;j<d;++j) { x=a[i+j]; y=a[i+j+d]; a[i+j]=x+y; a[i+j+d]=x-y; a[i+j]-=a[i+j]>=mod ? mod : 0; a[i+j+d]+=a[i+j+d]<0 ? mod : 0; } } void IFWT(int *a,int n) { int x,y; for(int d=1;d<n;d<<=1) for(int m=d<<1,i=0;i<n;i+=m) for(int j=0;j<d;++j) { x=a[i+j]; y=a[i+j+d]; a[i+j]=1LL*(x+y)*inv%mod; a[i+j+d]=1LL*(x-y+mod)%mod*inv%mod; } } int Pow(int a,int b) { int res=1;for(;b;a=1LL*a*a%mod,b>>=1) if(b&1) res=1LL*res*a%mod; return res; } int main() { for(int i=2;i<N;++i) a[i]=1; for(int i=2;i<N;++i) if(a[i]) for(int j=2;i*j<N;++j) a[i*j]=0; inv=Pow(2,mod-2); int n,m; int len; while(scanf("%d%d",&n,&m)!=EOF) { memset(b,0,sizeof(b)); for(int i=1;i<=m;++i) b[i]=a[i]; len=1; while(len<=m) len<<=1; FWT(b,len); for(int i=0;i<len;++i) b[i]=Pow(b[i],n); IFWT(b,len); printf("%d\n",b[0]); } }
相關推薦
bzoj千題計劃308:bzoj4589: Hard Nim(倍增FWT+生成函式)
#include<cstdio> #include<cstring> using namespace std; #define N 50001 const int mod=1e9+7; const int M=1<<16; int inv
bzoj千題計劃319:bzoj2865: 字串識別(字尾自動機 + 線段樹)
#include<map> #include<cstdio> #include<cstring> #include<algorithm> #define N 500001 using namespace std; char s[
bzoj千題計劃311:bzoj5017: [Snoi2017]炸彈(線段樹優化tarjan構圖)
#include<cstdio> #include<vector> #include<iostream> #include<algorithm> using namespace std; const int mod=1e9+7;
bzoj千題計劃314:bzoj3238: [Ahoi2013]差異(字尾陣列+st表+單調棧)
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; #define N 500001 int n
bzoj千題計劃315:bzoj3172: [Tjoi2013]單詞(AC自動機)
#include<queue> #include<cstdio> #include<cstring> using namespace std; #define N 2000001 using namespace std; int pos[20
bzoj千題計劃310:bzoj5285: [Hnoi2018]尋寶遊戲(思維題+雜湊)
#include<cstdio> #include<algorithm> #define N 5001 using namespace std; const int mod=1e9+7; int bit[N]; char s[N]; int has
bzoj千題計劃316:bzoj3173: [Tjoi2013]最長上升子序列(二分+樹狀陣列)
#include<cstdio> #include<iostream> #include<algorithm> using namespace std; #define N 100001 #define lowbit(x) x&-x
bzoj千題計劃309:bzoj4332: JSOI2012 分零食(分治+FFT)
#include<cmath> #include<cstdio> #include<algorithm> using namespace std; const int M=1<<17; #define N 10001 int m,
bzoj千題計劃321:bzoj5251: [2018多省省隊聯測]劈配(網路流 + 二分)
#include<queue> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; #d
bzoj千題計劃312:bzoj2119: 股市的預測(字尾陣列+st表)
#include<cmath> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; #d
bzoj千題計劃317:bzoj4650: [Noi2016]優秀的拆分(字尾陣列+差分)
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define N 30002 using namespace std; int n;
bzoj千題計劃318:bzoj1396: 識別子串(字尾自動機 + 線段樹)
#include<cstdio> #include<cstring> #include<algorithm> #define N 100001 using namespace std; char s[N]; int ch[N<&
bzoj千題計劃323:bzoj1951: [Sdoi2010]古代豬文(Lucas+CRT+尤拉定理)
#include<cmath> #include<cstdio> #include<iostream> using namespace std; const int mod=999911659; const int phi=mod-1; typ
bzoj千題計劃322:bzoj2561: 最小生成樹(最小割)
#include<cstdio> #include<queue> #include<cstring> #include<iostream> #include<algorithm> using namespace std;
bzoj千題計劃324:bzoj5249: [2018多省省隊聯測]IIIDX(線段樹)
#include<cmath> #include<cstdio> #include<iostream> #include<algorithm> using namespace std; #define N 500001 int d[N
bzoj千題計劃313:bzoj3879: SvT(字尾陣列+st表+單調棧)
#include<cstdio> #include<iostream> #include<algorithm> using namespace std; #define N 500001 #define M 3000001 int n,m,mm;
bzoj千題計劃320:bzoj4939: [Ynoi2016]掉進兔子洞(莫隊 + bitset)
#include<cmath> #include<cstdio> #include<bitset> #include<cstring> #include<iostream> #include<algorithm> us
BZOJ4589 Hard Nim(快速沃爾什變換模板)
code 時間 ons include pre zoj logs for turn 終於抽出時間來學了學,比FFT不知道好寫到哪裏去。 #include <cstdio> typedef long long ll; const int N=65536,p=1
BZOJ4589 Hard Nim(快速沃爾什變換FWT)
std ems 加速 多少 mem 一次 ++ log 素數篩 這是我第一道獨立做出來的FWT的題目,所以寫篇隨筆紀念一下。 (這還要紀念,我太弱了) 題目鏈接: BZOJ 題目大意:兩人玩nim遊戲(多堆石子,每次可以從其中一堆取任意多個,不能操作就輸)。$T$ 組數據,
Python外殼:程式碼結構!(推導式和函式 )
推導式: 推導式是一個或者多個迭代器快速簡潔的建立資料結構的一種方法。 它可以將迴圈和條件判斷結合,從而避免語法冗長的程式碼。 悄悄告訴你,會使用推導式。很大程度上說明,你已經超過許多初學者啦· 也就是說,使用推導式更加像python的風格· 列表推導式: 一個一個追加。 也