2018 杭電多校第六場 sacul

2021-08-22 16:14:27 字數 1413 閱讀 2531

題意:

題目倒過來就是題解什麼的真是太過分了一定要寫部落格嚶嚶嚶

首先是盧卡斯定理

c(n,m) mod p =  c(n%p,m%p)*c(n/p,m/p)mod p

一般是用來解決大數求組合數的【c(n/p,m/p)可以繼續用盧卡斯定理進行簡化】

但同時不停的整除q和對q求餘有沒有讓你想起 十進位制數轉q進製數。。。。。

所以也可以看成c(n,m)等於把n,m看成p進製數後,對應位上數字的組合數的乘積

所以c(i,j)>0 那麼就意味著 在p進製下,i的每一位都》=j的對應位上的數字(不然c(i,j)=0最後總的組合數乘積為0)

然後這個矩陣a可以看成圖的鄰接矩陣,a[i][j]就為從i走一步到j的方案數,a的k次方就為從 i走k步到j的方案數

同時如果滿足在p進製下,i的每一位數字都比j的對應位上的數字大於等於的話 那麼對應的圖里有一條從i->j的邊

然後我們要求的  f[n][k]  是a^k的所有元素和,答案就是在圖中走k步的方案數

矩陣的下標是從0到 p^n-1對應的是n位p進製數,在圖中走k步意味著要找乙個長度為k+1的序列,要求每個數字(n位q進製數)的每一位都大於等於上乙個數字的對應位。這n位互相之間不影響,所以對於每一位是找乙個長度為k+1的每個元素大於等於0小於p的不下降序列,插板法可得有c(k+p,p-1)種方法,有n位那麼就是 f[n][k]=c(k+p,p-1)^n種方法

最後答案的表示式就是

**:

#include#define ll long long

using namespace std;

const int mx=13e5+7;

const int mod=1e9+7;

int prime[mx],tt;

bool no_prime[mx];

ll inv[mx],fac[mx];

ll q_pow(ll a,ll b,ll mod)

return ret;

}void init()

}int p=prime[100000];

fac[0]=fac[1]=inv[0]=inv[1]=1;

for (int i=2;i<=p;i++)fac[i]=fac[i-1]*i%mod;

inv[p]=q_pow(fac[p],mod-2,mod);

for (int i=p;i>2;i--)inv[i-1]=inv[i]*i%mod;

} void solve()

printf("%lld\n",ans);

}int main()

總結下就是 加深了盧卡斯定理的運用

還有鄰接矩陣的k次方的含義這點

菜雞落淚orz

杭電多校第六場(IF)

題意 有命題 將 b 進製數y按位相加,迴圈無窮次,最終結果若 x 0,則有y x 0,反之不然 給出b和x,判斷命題是否成立 打表發現的b x 1時成立,看到有數論大佬推出來的 想看推導的右轉 includeusing namespace std typedef unsigned long lon...

20190807杭電多校第六場

賽中和隊友一直在搞乙個胡搞做法,艱難優化到本地跑10s,可惜始終過不了。最後只好補了題解做法。倒著刪除,用樹狀陣列求lis,維護一條當前的lis的路徑。若被刪除的數不在當前的lis中,則答案不變 否則,重新做一遍lis。據說因為lis的期望長度為sqrt n 所以被選中的概率是 ac include...

2019 杭電多校(第六場)

1005 snowy smile 線段樹 題意給你n個點 讓你畫個矩形 使矩形內所含點的權值和最大 必須有點 思路離散化 列舉矩形的左右區間 線段樹維護y座標的最大欄位和 複雜度 o n n lgn include using namespace std typedef long long ll c...