#loj 3058 [HNOI2019] 白兔之舞

單位根反演思博題

模數是亂給的記得整個任意模數ntt

k為p-1的約數意味著一定存在k次單位根,設g是p的原根則\(w_{k}^{1}=g^{\frac{k-1}{p}}\)

既然k次單位根存在自然考慮單位根反演了

\(f(i)\)表示跳了i步并且停在了第二維為y的頂點的方案數

\(st\)表示初始向量而\(A\)表示轉移矩陣,那么有

\[f(i)={n \choose i}(st×A^i)(y)\]

那么可以構造數列\(f\)的一般生成函數\(F(z)=\sum_{k}f(k)z^k\)

現在先讓我們考慮如何求出\(F(z)\)中恰好是k的倍數的項之和,即求出

\[\sum_{i}[i|k]{n \choose i}(st×A^i)(y)\]

\[\sum_{i}\sum_{j}\omega_{k}^{ij}{n \choose i}(st×A^i)(y)\]

\[\sum_{i}\sum_{j}\omega_{k}^{ij} {n \choose i}(st×A^i)(y)\]

\[\sum_{j}\sum_{i} {n \choose i}(\omega_{k}^{ij}A^i)(y)\]

\[\sum_{j}(st×(\sum_{i} {n \choose i}(\omega_{k}^{j}A)^i))(y)\]

\[\sum_{j}(st×(1+\omega_{k}^{j}A)^n)(y)\]

看起來就很好算了吧

啊,如果現在要求模k是某個特定的值怎么辦呢?

很簡單啊,把f數列整體平移若干個單位就可以了

為了方便起見設\(g(j)=(st×(1+\omega_{k}^{j}A)^n)(y)\)

如果我們現在處理的生成函數是\(F(z)z^t\)的話,我們的式子應該長這樣

\[\sum_{j}g(j)\omega_{k}^{tj}\]

那么如何對于每一個t處理出上面的東西呢?

教練我會多點求值!

大常數\(O(nlog^2n)\)肯定是涼的

這其實是任意長度fft,有一個\(O(nlogn)\)的優秀做法

具體來講借助了這個恒等式

\[tj={t+j \choose 2}-{t \choose 2}-{j \choose 2}\]

那么現在我們要求的東西就變成了

\[\omega_{k}^{-{t \choose 2}}\sum_{j}\frac{g(j)}{\omega_{k}^{{j \choose 2}}}\omega_{k}^{{t+j \choose 2}}\]

\(p(n)=\frac{g(n)}{q(n)},q(n)=\omega_{k}^{{n \choose 2}}\)

則我們算的就是

\[\omega_{k}^{-{t \choose 2}}\sum_{i-j=t}g(j)q(i)\]

顯然是個差卷積,隨便fft幾下就行了

#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;const int N=262144+10;const int D=18;
typedef long long ll;typedef double db;const db pi=acos(-1.0);
const int P=32768;const int SF=15;const int msk=32767;ll PP;ll mod;
inline ll po(ll a,ll p){ll r=1;for(;p;p>>=1,a=a*a%mod)if(p&1)r=r*a%mod;return r;}
namespace poly
{struct cmp{db r;db v;friend cmp operator +(cmp a,cmp b){return (cmp){a.r+b.r,a.v+b.v};}friend cmp operator -(cmp a,cmp b){return (cmp){a.r-b.r,a.v-b.v};}friend cmp operator *(cmp a,cmp b){return (cmp){a.r*b.r-a.v*b.v,a.r*b.v+a.v*b.r};}void operator /=(const db& b){r/=b;v/=b;}}tr[N],tr1[N],tr2[N],tr3[N],tr4[N],rt[2][20][N];int rv[20][N];ll m13[N],m24[N],m14[N],m23[N];inline void pre(){for(int d=1;d<=D;d++)for(int i=0;i<(1<<d);i++)rv[d][i]=(rv[d][i>>1]>>1)|((i&1)<<(d-1));for(int d=1,t=1;d<=D;d++,t<<=1)for(int i=0;i<(1<<d);i++)rt[0][d][i]=(cmp){cos(i*pi/t),sin(i*pi/t)};for(int d=1,t=1;d<=D;d++,t<<=1)for(int i=0;i<(1<<d);i++)rt[1][d][i]=(cmp){cos(i*pi/t),-sin(i*pi/t)};PP=(ll)P*P%mod;}inline void fft(cmp* a,int len,int d,int o){for(int i=0;i<len;i++)if(i<rv[d][i])swap(a[i],a[rv[d][i]]);int i;cmp * w;for(int k=1,j=1;k<len;k<<=1,j++)for(int s=0;s<len;s+=(k<<1))for(i=s,w=rt[o][j];i<s+k;++i,++w){cmp a1=a[i+k]*(*w);a[i+k]=a[i]-a1;a[i]=a[i]+a1;}if(o)for(int i=0;i<len;i++)a[i]/=len;}inline void dbdft(ll* a,int len,int d,cmp* op1,cmp* op2){for(int i=0;i<len;i++)tr[i]=(cmp){(db)(a[i]>>SF),(db)(a[i]&msk)};fft(tr,len,d,0);tr[len]=tr[0];for(cmp* p1=tr,*p2=tr+len,*p3=op1;p1!=tr+len;++p1,--p2,++p3)(*p3)=(cmp){p1->r+p2->r,p1->v-p2->v}*(cmp){0.5,0};for(cmp *p1=tr,*p2=tr+len,*p3=op2;p1!=tr+len;++p1,--p2,++p3)(*p3)=(cmp){p1->r-p2->r,p1->v+p2->v}*(cmp){0,-0.5};}inline void dbidft(cmp* a,int len,int d,ll* op1,ll* op2){fft(a,len,d,1);for(int i=0;i<len;i++)op1[i]=(ll)(a[i].r+0.5)%mod;for(int i=0;i<len;i++)op2[i]=(ll)(a[i].v+0.5)%mod;}cmp tst[N];inline void mul(ll* a,ll* b,ll* c,int len,int d){dbdft(a,len,d,tr1,tr2);dbdft(b,len,d,tr3,tr4);for(int i=0;i<len;i++)tr[i]=tr1[i]*tr3[i]+(cmp){0,1}*tr2[i]*tr4[i];dbidft(tr,len,d,m13,m24);for(int i=0;i<len;i++)tr[i]=tr1[i]*tr4[i]+(cmp){0,1}*tr2[i]*tr3[i];dbidft(tr,len,d,m14,m23);for(int i=0;i<len;i++)c[i]=(m13[i]*PP+(m14[i]+m23[i])*P+m24[i])%mod;}
}
namespace calcg
{int zhi[N];int ct;int nu[N];int divs[N];int hd;inline bool ck(int g){for(int i=1;i<=hd;i++)if(divs[i]!=mod-1&&po(g,divs[i])==1)return false;return true;}inline void dfs(int cur,int nw){if(cur==ct+1){divs[++hd]=nw;return;}for(int i=0;i<=nu[cur];i++,nw*=zhi[cur])dfs(cur+1,nw);}inline int solve(){ll phi=mod-1;for(ll i=2;i*i<=phi;i++)if(phi%i==0){zhi[++ct]=i;while(phi%i==0)nu[ct]++,phi/=i;}if(phi!=1)zhi[++ct]=phi,nu[ct]=1;dfs(1,1);for(int g=2;g<=mod-1;g++)if(ck(g))return g;return -1;}
}
int S;
struct mar
{ll mp[4][4];inline ll * operator [](const int& x){return mp[x];}mar(){for(int i=0;i<4;i++)for(int j=0;j<4;j++)mp[i][j]=0;}friend mar operator *(mar a,mar b){mar c;for(int i=1;i<=S;i++)for(int k=1;k<=S;k++)for(int j=1;j<=S;j++)(c[i][j]+=a[i][k]*b[k][j])%=mod;return c;}
}st,trs,ori;ll gen;ll omg;
ll f[N];ll sw[N];int n;int k;int l;int x;int y;
ll res[N];ll ans[N];
inline ll ctwo(ll n){return ((ll)n*(n-1)/2)%(mod-1);}
int main()
{scanf("%d%d%d%d%d%lld",&n,&k,&l,&x,&y,&mod);S=n;for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)scanf("%lld",&ori[i][j]);poly::pre();gen=calcg::solve();omg=po(gen,(mod-1)/k);for(int i=0;i<=2*k;i++)sw[i]=po(omg,ctwo(i));for(int t=0;t<k;t++){st=mar();st[1][x]=1;ll wkt=po(omg,t);for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)trs[i][j]=ori[i][j]*wkt%mod;for(int i=1;i<=n;i++)(trs[i][i]+=1)%=mod;for(int p=l;p;p>>=1,trs=trs*trs)if(p&1)st=st*trs;f[t]=st[1][y];}for(int t=0;t<k;t++)(f[t]*=po(sw[t],mod-2))%=mod;for(int t=0;t<k;t++)if(t<(k-t))swap(f[t],f[k-t]);int len=1;int d=0;while(len<k+k)len<<=1,d++;poly::mul(f,sw,res,len,d);for(int i=0;i<k;i++)(ans[i]=res[i+k]*po(k*sw[i]%mod,mod-2))%=mod;ans[k]=ans[0];for(int i=k;i>=1;i--)printf("%lld\n",ans[i]);return 0;
}

轉載于:https://www.cnblogs.com/sweetphoenix/p/10833517.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/393806.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/393806.shtml
英文地址,請注明出處:http://en.pswp.cn/news/393806.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

標桿徐2018 Linux自動化運維實戰,標桿徐2018 Linux自動化運維系列⑦: SaltStack自動化配置管理實戰...

結合企業自動化集群場景講解&#xff0c;輕松玩轉SaltStack自動化配置管理工具第1章 SaltStack基礎應用SaltStack安裝SaltStack認證Saltstack遠程執行SaltStack配置管理第2章 SaltStack數據系統SaltStack數據系統-Grains 客戶端向服務端發送狀態SaltStack數據系統-paiil 服務…

JS 對象引用問題

var a {n:1}; var b a; a {n:2}; a.x a ;console.log(a.x);console.log(b.x); var a {n:1}; var b a; a.x a {n:2}; console.log(a.x);console.log(b.x); 這兩個問題主要理解兩點就很簡單了。 對象是引用類型&#xff0c;改變賦值只是改變指針的引用。運算符相當于改變…

工程代碼_Egret開發筆記(二)基礎工程代碼閱讀

代碼目錄結構在Egret Wing中打開上一節中我們創建的項目工程&#xff0c;查看代碼目錄結構&#xff0c;Forward在如下圖中標記了各個目錄的及關鍵文件的用途。代碼閱讀理解接下來我們從web入口一步一步閱讀初始代碼。首先打開index.html文件&#xff0c;我們看到index文件內容如…

知曉云助力小程序開發

小程序開發遇到瓶頸雖然騰訊提供了小程序解決方案&#xff0c;https://cloud.tencent.com/solution/la。但是對于普通開發者或者小企業的開發人員來說&#xff0c;購買域名&#xff0c;網站備案、部署SSL證書&#xff0c;安裝會話服務器。業務邏輯上要使用數據庫&#xff0c;緩…

leetcode131. 分割回文串(回溯)

給定一個字符串 s&#xff0c;將 s 分割成一些子串&#xff0c;使每個子串都是回文串。 返回 s 所有可能的分割方案。 示例: 輸入: “aab” 輸出: [ [“aa”,“b”], [“a”,“a”,“b”] ] 代碼 class Solution {List<List<String>> stringListnew ArrayList…

Cracer滲透-windows基礎(系統目錄,服務,端口,注冊表)

系統目錄C:\Windows\system32\config\SAM (保存系統密碼) 無法正常修改&#xff0c;可以進入PE系統進行修改&#xff08;先備份在清空&#xff09;利用結束后&#xff0c;再將之前備份的恢復C:\Windows\System32\drivers\hosts&#xff08;域名解析文件&#xff09;hosts欺騙&a…

java--xml文件讀取(SAX)

SAX解析原理&#xff1a; 使用Handler去逐個分析遇到的每一個節點 SAX方式解析步奏&#xff1a; 創建xml解析需要的handler&#xff08;parser.parse(file,handler)&#xff09; package com.imooc_xml.sax.handler;import java.util.ArrayList;import org.xml.sax.Attributes…

算法訓練營 重編碼_編碼訓練營之后該做什么-以及如何獲得成功

算法訓練營 重編碼by Anthony Morris安東尼莫里斯(Anthony Morris) 編碼訓練營之后該做什么-以及如何獲得成功 (What to do — and how to find success — after a coding bootcamp) It’s almost been two years since I graduated from the Lighthouse Labs Web Developmen…

leetcode860. 檸檬水找零(貪心)

在檸檬水攤上&#xff0c;每一杯檸檬水的售價為 5 美元。 顧客排隊購買你的產品&#xff0c;&#xff08;按賬單 bills 支付的順序&#xff09;一次購買一杯。 每位顧客只買一杯檸檬水&#xff0c;然后向你付 5 美元、10 美元或 20 美元。你必須給每個顧客正確找零&#xff0…

linux防火墻開啟某端口命令行,linux上防火墻 開啟某個端口

linux下防火墻 開啟某個端口直接在/etc/sysconfig/iptables中增加一行&#xff1a;-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 8080 -j ACCEPT注意添加位置:-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 25 -j ACCEPT-A RH-Fi…

imp命令導入指定表_Sqoop 使用shell命令的各種參數的配置及使用方法

點擊上方藍色字體&#xff0c;選擇“設為星標”回復”資源“獲取更多資源本文作者&#xff1a;Sheep Sun本文鏈接&#xff1a;https://www.cnblogs.com/yangxusun9/p/12558683.html大數據技術與架構點擊右側關注&#xff0c;大數據開發領域最強公眾號&#xff01;暴走大數據點擊…

黑客頻繁來襲 關注云計算的安全與保障

本文講的是 : 黑客頻繁來襲 關注云計算的安全與保障 , 【IT168 資訊】日前&#xff0c;虎嗅網遭受網絡攻擊的事件&#xff0c;引起業內關注。2月27日晚&#xff0c;虎嗅網中斷訪問&#xff0c;虎嗅網新浪官方微博隨即發表聲明&#xff0c;表示網站受到惡意攻擊&#xff0c;隨…

51nod 1100:斜率最大

題目鏈接 斜率最大點對橫坐標必相鄰 #include <bits/stdc.h> using namespace std; const int maxn 1e4 100;struct point {int x, y, pos;bool operator < (const point& rhs)const{return x<rhs.x;} } a[maxn]; double xielv(point a, point b) {return (a…

ik分詞和jieba分詞哪個好_Pubseg:一種單雙字串的BiLSTM中文分詞工具

中文分詞是中文自然語言處理中的重要的步驟&#xff0c;有一個更高精度的中文分詞模型會顯著提升文檔分類、情感預測、社交媒體處理等任務的效果[1]。Pubseg是基于BiLSTM中文分詞工具&#xff0c;基于ICWS2005PKU語料訓練集訓練而成&#xff0c;其優點在于在ICWS2005-PKU語料下…

freecodecamp_freeCodeCamp.org隱私權政策:問題與解答

freecodecampWe take your privacy seriously. And we give you full control over your data.我們把你的隱私當回事。 而且&#xff0c;我們可以完全控制您的數據。 freeCodeCamp doesnt show you ads or sell your data to anyone. Our nonprofit is instead supported by t…

leetcode1029. 兩地調度(貪心算法)

公司計劃面試 2N 人。第 i 人飛往 A 市的費用為 costs[i][0]&#xff0c;飛往 B 市的費用為 costs[i][1]。 返回將每個人都飛到某座城市的最低費用&#xff0c;要求每個城市都有 N 人抵達。 示例&#xff1a; 輸入&#xff1a;[[10,20],[30,200],[400,50],[30,20]] 輸出&…

第一階段沖刺4

1、我昨天的成就&#xff1a;看相關android開發視頻&#xff0c;上網尋找如何實現app動畫效果2、遇到什么困難&#xff1a;網上的用的很高級&#xff0c;看不懂別人如何實現的&#xff0c;搬過來實現不了。3、今天的任務&#xff1a;繼續實現動畫效果。 轉載于:https://www.cnb…

小白做淘客店鋪新玩法

微信淘客在朋友圈刷了將近兩個月。有些大咖賺得盆滿缽滿&#xff0c;有些小白交了不少學費。有人日入幾千幾萬&#xff0c;也有入不敷出。在此咖妹并沒有褒貶之意&#xff0c;只是提醒大家&#xff0c;不光淘客如此&#xff0c;其他項目亦是如此&#xff0c;別人能做成功的項目…

局域網中實現linux與windows文件共享,使用samba組建Linux與Windows局域網實現文件共享...

使用samba&#xff0c;可以組建Windows與Linux的局域網&#xff0c;Linux我用的是Fedora Core 6。Samba軟件的最新版本可以從網站免費獲得。共可下得5個rpm&#xff0c;分別為&#xff1a;samba-3.0.24-1.i386.rpm&#xff1a;服務器端&#xff1b;samba-client-3.0.24-1.i386.…

python sum函數numpy_如何用numba加速python?

我把寫好的markdown導入進來&#xff0c;但是沒想到知乎的排版如此感人。如果對知乎排版不滿想要看高清清爽版&#xff0c;請移步微信公眾號原文 如何用numba加速python&#xff1f;同時歡迎關注前言說道現在最流行的語言&#xff0c;就不得不提python。可是python雖然容易上手…