CSP校門前的樹

2022-09-09 20:09:27 字數 1907 閱讀 7527

初步思路:

預處理出340以內的素數陣列[ 68 ](因為對於大於340的數,如果是合數,必然會被340以內的數整除(若不能,必大於1e5),那麼判斷進行質因數分解,只需逐個去除這個素數陣列即可,最後如果不是1,便是最後乙個素數)

對於求[al,ar)內的完美種類數,將ar-al進行因數分解,得到所有因數(不一定是質因數),然後乙個乙個檢測,如果能夠被am-ai整除,則淘汰,最後剩下的個數就是以al,ar為邊界的完美種類數

設 g[i][j]表示以[i,j)為邊界的方案種類數,f[i][j]表示從i到j所有方案數;終究還是錯了,狀態轉移方程錯誤,沒找到正確的關係;首先,f一定是由組合體和單一體組合而成,而組合體也是如此,那麼對於組成f的任意一種情況,可以看做是在ij之間任意插入若干個節點進行分割,f_ij便是所有情況的和,顯然這樣是比較難求的,那麼就要進行分解,分解成簡單問題,分解動作一般就是以某個東西作為衡量,這種東西的所有情況可以代表了原問題的所有情況==》那麼在這道題中,我們以最後乙個分界線與結尾處組成的單一體的長度為衡量標準,此分界線前面的情況任意,那麼這樣(長度範圍為[1 , j-i-1]+g)的確可以包含所有情況

由於區間不存在大於關係,這裡應該採用長度遞推,而由於i,j不會重複,那麼g的求解便不會重複;長度為1的時候,g的結果可以賦給f,到後來g可以在當前步驟直接求解,而f直接採用遞推即可

正如所料,超時!顯然,畢竟做了那麼多明顯重複的操作,對於每乙個obs[j]-obs[i]

都要計算所有因數,必然超時,那麼,這次我終於明白了什麼叫做數論題目的打表操作,就是對於數論操作中可能會經常重複 使用的值,提前預處理出來,到用的時候直接線性查詢即可,雖然在預處理的時候可能看上去似乎資料量巨大,划不來,實際上經過簡單的數學分析就會發現,這樣會減少很多重複性工作(思政教育:經驗的確重要,但使用經驗之前,還是要經過理性判斷斟酌一下!)

tle**:

//#include#include#define local

using namespace std;

typedef long long ll;

//這裡必須使用長整型,因為即使mod是整型,但只要出現兩個數相乘,就會出現溢位

const ll maxn=1010;

const ll mod=1e9+7;

// int prm[70];int pn;

ll obs[maxn];

ll dp[maxn];

ll read()

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

return f*s;

}// 歐氏篩實現340以內素數陣列

// int mark[340];

// int get_prm()

// }

// return k;

// }

ll get_g(int i,int j)

}if (flag) cont++;

ll tmpk=dft/k;

if (tmpk==k) continue;

flag=1;

for (int m=i+1;m<=j-1;++m)

}if (flag) cont++;

}cont%=mod;

} return cont;}

int main()

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

return f*s;}

int main()

}flag[dft]=1;

// dp[i]=(dp[i]+dp[j]*get_g(j,i)%mod)%mod;

dp[i]=(dp[i]+dp[j]*cont%mod)%mod;

} // dp[i]=(dp[i]+get_g(0,i))%mod;

} printf("%lld",dp[n-1]);

return 0;

}

差分法 學校門前的樹

description 校門外長度為l的馬路上很有多顆樹,每兩棵相鄰的樹之間的間隔是1公尺。我們可以簡化的把馬路看成乙個數軸,馬路的一端在數軸中x 0的位置,另一端在x l的位置 數軸上的每個整數點即0,1,2,3 l,都種有一棵樹。現在光頭強要把其中一些區域中的樹全部砍走。已知任一區域中的起點和終...

CSP202104 4 校門外的樹

原題點我 打眼一看,感覺是個dp,而我的dp很菜 其實不管什麼都很菜 看到區間就想到區間dp,導致有一點思路,但是無法實現。實際上我們不關心中間的某一段的種樹情況,只需要知道從第乙個障礙物開始到最後乙個障礙物結束的種樹方案,因此只需要一維陣列。用 f i 表示從第乙個障礙物到第 i 個障礙物的總方案...

校門外的樹

描述 某校大門外長度為 l的馬路上有一排樹,每兩棵相鄰的樹之間的間隔都是 1公尺。我們可以把馬路看成乙個數軸,馬路的一端在數軸 0的位置,另一端在 l的位置 數軸上的每個整數點,即0,1,2 l,都種有一棵樹。馬路上有一些區域要用來建地鐵,這些區域用它們在數軸上的起始點和終止點表示。已知任一區域的起...