bzoj1025 [SCOI2009]游戏 动态规划
生活随笔
收集整理的這篇文章主要介紹了
bzoj1025 [SCOI2009]游戏 动态规划
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題目描述
對(duì)于一些長(zhǎng)度為n的排列,將其作為一個(gè)置換,那么可能有一個(gè)自置換的次數(shù)使其回到1,2,3,...,n的情況。求對(duì)于所有能夠回到1,2,3..,n的排列,不同的次數(shù)共有多少種。
?
題解來(lái)自黃學(xué)長(zhǎng)
這道題可以轉(zhuǎn)換一下。
試想每一個(gè)對(duì)應(yīng)關(guān)系a-b為從a->b的一條邊,
那么圖中一定存在n條邊且每個(gè)點(diǎn)入度出度都為1,
易證一定存在一個(gè)或幾個(gè)環(huán)。
實(shí)際上排數(shù)就是這幾個(gè)環(huán)大小的最小公倍數(shù)。
即求和為n的數(shù)列的最小公倍數(shù)種數(shù)。
那么可以直接DP
#include<algorithm> #include<cstdio> #include<cstdio> using namespace std; int n,tot; int pri[1005]; long long ans,f[1005][1005]; bool vis[1005]; void getpri(){for(int i=2;i<=1000;i++){if(!vis[i])pri[++tot]=i;for(int j=1;j<=tot&&pri[j]*i<=1000;j++){vis[pri[j]*i]=1;if(i%pri[j]==0)break;}} } int main(){scanf("%d",&n);getpri();f[0][0]=1;for(int i=1;i<=tot;i++){for(int j=0;j<=n;j++)f[i][j]=f[i-1][j];for(int j=pri[i];j<=n;j*=pri[i])for(int k=0;k<=n-j;k++)f[i][k+j]+=f[i-1][k];}for(int i=0;i<=n;i++)ans+=f[tot][i];printf("%lld",ans); }?
轉(zhuǎn)載于:https://www.cnblogs.com/Elfish/p/7676792.html
總結(jié)
以上是生活随笔為你收集整理的bzoj1025 [SCOI2009]游戏 动态规划的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 2017-2018-1 20155338
- 下一篇: oracle的那些事