ⅰ.樸
素做
法\colorⅰ.樸素做法
ⅰ.樸素做法設d
p[k]
為當前序
列長k有
多少種選
法設dp[k]為當前序列長k有多少種選法
設dp[k]
為當前序
列長k有
多少種選
法 那 麼對
於當前的
ai,篩
選ai的
所有因子
s那麼對於當前的a_i,篩選a_i的所有因子s
那麼對於當前
的ai
,篩選a
i的所
有因子sdp
[s]+
=dp[
s−1]
dp[s]+=dp[s-1]
dp[s]+
=dp[
s−1]但是
這樣直接
轉移dp
陣列已經
改變了,
下乙個因
子的轉移
可能會出
問題
但是這樣直接轉移dp陣列已經改變了,下乙個因子的轉移可能會出問題
但是這樣直接
轉移dp
陣列已經
改變了,
下乙個因
子的轉移
可能會出
問題 所以我
們先用t
emp數
組和nu
m陣列保
存本次加
多少,再
一起加上
去所以我們先用temp陣列和num陣列儲存本次加多少,再一起加上去
所以我們先用
temp
陣列和n
um陣列
儲存本次
加多少,
再一起加
上去
#include using namespace std;
typedef long long ll;
const ll mod=1e9+7;
const int maxn=1000009;
ll n,a[maxn],dp[maxn];
ll temp[maxn],num[maxn],top;
int main()
for(int j=1;j<=top;j++)
}ll ans=0;
for(int i=1;i<=n;i++)
ans = ( ans+dp[i] )%mod;
cout << ans;
}
ⅱ.因
子篩
\colorⅱ.因子篩
ⅱ.因子篩
前 麵用
額外陣列
來輔助轉
移前面用額外陣列來輔助轉移
前面用額外數
組來輔助
轉移 實際上
我們可以
先從大的
因子轉移
,再轉移
到小的因
子實際上我們可以先從大的因子轉移,再轉移到小的因子
實際上我們可
以先從大
的因子轉
移,再轉
移到小的
因子 這樣類
似01揹包
的倒序轉
移就不會
影響
這樣類似01揹包的倒序轉移就不會影響
這樣類似01
揹包的倒
序轉移就
不會影響但是
如何獲得
從大到小
的所有因
子呢
?但是如何獲得從大到小的所有因子呢?
但是如何獲得
從大到小
的所有因
子呢?
因 為n
=100000,所
以直接使
用因子篩
因為n=100000,所以直接使用因子篩
因為n=10
0000
,所以直
接使用因
子篩
void init()//預先處理因子
}}
然後轉
移的時候
直接從大
因子開始
轉移即可
然後轉移的時候直接從大因子開始轉移即可
然後轉移的時
候直接從
大因子開
始轉移即
可
質數篩選 素數篩選法
int prime 100010 void prime for int i 1 i i 1000000 i define size 1000000 int main 元素值為0代表是素數 int prime size int pos 0 int flag for int i 2 i size i p...
素數的篩選方法 從暴力篩選到線性篩選
也被就叫做試除法,對於每乙個整數n,你都可以進行一次從2到根號n的篩選,如果這個數不能被從2到根號n的任意乙個數整除,就可以確定這個數是素數.int prime maxn num void screening int n if flag prime num i 對於這種最樸素的方法所需的時間複雜度也...
艾氏篩選法篩選素數
const int maxn 700000 1 到10000007共有60萬多個素數 const int maxnu 10000007 整數範圍內 bool is prime maxn 判斷是否為素數 int prime maxnu 儲存素數 int p 儲存素數的個數 void seive 經典題...