国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

數位dp-P2518 [HAOI2010]計數

2019-11-08 01:53:36
字體:
來源:轉載
供稿:網友

https://www.luogu.org/PRoblem/show?pid=2518 對于一個數,把其中的0刪掉,相當于把0放到了前面; 所以這個問題就是讓我們求一下給我們的數的全排列比當前小的有幾個; 我們假設a[i]代表數字i 0~9有幾個; 那么用這些來表示全排列 (a[0]+a[1]+…+a[9])!/a[0]!/a[1]!/…/a[9]!; 當然如果a[i]==0那么不參與運算; 但是這樣的話,longlong表示存不下; 所以我們要用高精度 所以我們在想想; 假如現在有m個位置; 我們先把0放法放好 C(m,a[0]); 之后就只有m-a[0]個位置; 然后在放1 C(m-a[0],a[1]); 所以答案是 C(m,a[0])xC(m-a[0],a[1])x…xC(m-a[0]-a[1]-..-a[8],a[9]); 就可以算全排列; 思路和數位dp差不多; 一位一位向前推進;

#include<iostream>#include<cstdlib>#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>#define Ll long longusing namespace std;Ll CC[1001][1001];Ll C(Ll n,Ll m){ if(CC[n][m])return CC[n][m]; if(m==1)return n; if(m==0||m==n)return 1; if(m>n)return 0; CC[n][m]=C(n-1,m)+C(n-1,m-1); return CC[n][m];}int a[10],v[100];Ll ans;int n;char c;Ll cfb(){ Ll ans=1; int m=n; for(int i=0;i<=9;i++)if(a[i])ans*=C(m,a[i]),m-=a[i]; return ans;}int main(){ while(cin>>c)if(isdigit(c))v[++n]=c-48,a[v[n]]++; int nn=n; for(int i=1;i<=nn;i++){ n--; for(int j=0;j<v[i];j++) if(a[j]){a[j]--;ans+=cfb();a[j]++;} a[v[i]]--; } printf("%lld",ans);}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 寿宁县| 连城县| 绥棱县| 周至县| 灌阳县| 东山县| 通化市| 江都市| 三河市| 延川县| 金昌市| 成武县| 东山县| 理塘县| 宜阳县| 靖州| 吴川市| 九台市| 三台县| 海宁市| 襄垣县| 宝清县| 墨江| 鄂伦春自治旗| 永城市| 枣庄市| 赤壁市| 定远县| 西乌| 聊城市| 田林县| 陕西省| 平武县| 齐齐哈尔市| 永德县| 武冈市| 西盟| 独山县| 横峰县| 民县| 温州市|