題解:碰到計數題都要想想容斥
就跟碰到最大值最小要想想二分一樣
考慮沒有乙個數是質數
那就確定了每乙個數的取值範圍
那麼dp方程很顯然
然後構造矩陣來優化轉移
可以發現每個決策時一樣的 所以矩陣可以一列一列的複製
#include #pragma comment(linker,"/stack:102400000,102400000")#pragma g++ optimize (「o2」)
using
namespace
std;
#define ll long long
const ll maxn= 2e7+100
;#define mo 20170408ll k,n,m;
bool f[maxn+10
];struct
rea;
re tmp,c;
re xx(re x,re y)
return
(tmp);
}re fastpow(ll x)
intmain()
}for (ll i=1;i<=m;i++)
if (!f[i])
for (ll i=1;i)
for (ll i=1;i<=m;i++)
a.jz2[((-i%k)+k)%k][0]++;
for (ll i=1;i)
re d=fastpow(n);
cout
<<(d.jz2[0][0]-d.jz1[0][0]+mo)%mo;
return0;
}
Sdoi2017 序列計數
alice想要得到乙個長度為n的序列,序列中的數都是不超過m的正整數,而且這n個數的和是p的倍數。alice還希望 這n個數中,至少有乙個數是質數。alice想知道,有多少個序列滿足她的要求。一行三個數,n,m,p。1 n 10 9,1 m 2 10 7,1 p 100 一行乙個數,滿足alice的...
SDOI2017 序列計數
這道題非常的迷幻 首先我們要容斥 考慮記 dp i j 表示前 i 位 p j 的方案數 g i j 表示前 i 位只用合數 p j 的方案數 於是可以考慮最暴力的 dp 是 o nm p 的 但是並沒必要 我們可以提前處理 1 m 這些數 p 的值,用這些值來轉移就好了 也就是額外記乙個 cnt ...
Sdoi2017 序列計數
time limit 30 sec memory limit 128 mb submit 317 solved 210 alice想要得到乙個長度為n的序列,序列中的數都是不超過m的正整數,而且這n個數的和是p的倍數。alice還希望 這n個數中,至少有乙個數是質數。alice想知道,有多少個序列滿...