洛谷P3702 SDOI2017 序列計數

2021-08-18 08:45:37 字數 1798 閱讀 1379

alice想要得到乙個長度為n

n 的序列,序列中的數都是不超過m

m 的正整數,而且這n

n 個數的和是p

p 的倍數。

alice還希望,這n

n 個數中,至少有乙個數是質數。

alice想知道,有多少個序列滿足她的要求。

輸入格式:

一行三個數,n,m,pn,

m,p 。

輸出格式:

一行乙個數,滿足alice的要求的序列數量,答案對2017040820

1704

08取模。

輸入樣例#1:

3 5 3

輸出樣例#1:

33

對20\%20

% 的資料,1\leq n,m\leq1001≤

n,m≤

100對50\%50

% 的資料,1\leq m \leq 1001≤

m≤10

0對80\%80

% 的資料,1\leq m\leq 10^61≤

m≤10

6對100\%10

0%的資料,1\leq n \leq 10^9,1\leq m \leq 2\times 10^7,1\leq p\leq 1001≤

n≤10

9,1≤

m≤2×

107,

1≤p≤

100時間限制:3s

空間限制:128mb

據說正解是dp+矩陣快速冪。。。

然而我用了生成函式+快速冪,fft都沒用到。。。

首先這題顯然補集轉化,就是用全部方案減去不含任何質數的方案。

考慮m比較小,我們能大力把<=m的質數全都篩出來。

發現n很大,要麼倍增要麼快速冪。。。

發現p相當小,所以我們能在mod p的同餘系下做啊。

一看到同餘系下求方案數立刻想到卷積和生成函式。。。

假設我們有乙個多項式f(x),其中x^i的係數為a個數的序列mod p為i的方案數(a為我們引入的變數)。

同時我們有另乙個多項式g(x),其中x^i的係數為b個數的序列mod p為i的方案數(b為我們引入的變數)。

那麼,我們如果讓f(x)和g(x)做卷積的話,新的多項式x^i的係數就是(a+b)個數的序列mod p為i的方案數的說。

這就是生成函式了。

回到這個題,我們先初始化多項式f(x),令x^i的係數為為1個數mod p為i的方案數。

然後我們求出這個多項式的n次方,就是我們需要的答案了。

發現這道題的p很小,我們連fft都不用,直接用乙個多項式類暴力快速冪就行了。複雜度o(m+p^2logn),跑的飛快。。。

附**:

#include#include#include#include#define maxn 110

#define maxm 2000010

#define mod 20170408

using namespace std;

int n,m,p,k=0,prime[maxm];

bool np[maxm*10];

struct node

}one,two;

inline int read()

while(c>='0'&&c<='9')

return date*w;

}void make()

} for(int i=1;i<=m;i++)

}node operator *(const node &x,const node &y)

return ans;

}int main()

洛谷P2434 SDOI 區間

解題思路 這道題就是簡單的模擬啊。不過愣是沒有模擬對,看來還需要加強 實現能力。先按照左端點從小到大排序,每次驗證當前區間左端點是否大於設定的右端點,如果大於,說明不相交,就輸出設定的左右端點,如果小於等於,說明有相交的部分,不斷更新右端點。include include include inclu...

洛谷P2486 SDOI2011 染色

輸入格式 輸出格式 對於每個詢問操作,輸出一行答案。輸入樣例 1 6 5 2 2 1 2 1 1 1 21 3 2 42 5 2 6q 3 5 c 2 1 1 q 3 5 c 5 1 2 q 3 5 輸出樣例 1 典型的樹鏈剖分 線段樹,線段樹維護 區間左右端點顏色 和 區間顏色數。注意 當 上傳或...

洛谷 P2351 SDOi2012 吊燈

挺巧妙的一道題,類似樹形dp 大致題意 先給你一棵樹,然後會讓你改變9次樹的形態,問 對於原始狀態和每次改變後的這棵樹,要你把這棵樹的節點分成若干組,使得所有組的節點均相連且所有組的節點數相同。請問當每組的節點數均為多少的滿足條件。可以發現,每組的節點數一定是n的約數,且1,n肯定是。然後,通過畫圖...