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肯定是。然後,通過畫圖...