題意:
題目倒過來就是題解什麼的真是太過分了一定要寫部落格嚶嚶嚶
首先是盧卡斯定理
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...