NOIp2018集訓test-9-5(am)
阿新 • • 發佈:2018-09-06
none one scanf str 組合 題解 mat names 統計
Problem A. maze
遞歸處理,題解寫得真簡單。
我大概這輩子也寫不出來這種東西吧。
Problem B. count
容易發現合法的數中一定有且僅有兩個數加起來等於10,其他數兩兩配對加起來等於9或者0。
考場上就隨便統計了下數的個數,然後組合數給每個不夠的數配,結果忘了還有?和?配的情況,下來??隨便選了下,發現會有重復的部分,大概只能dp了。
枚舉加起來等於10的數是哪兩個,然後dp。
f[i][j](0<=i<=4)表示 0/9,1/8……i/9-i的數量已經確定了,用了j個?的方案數。因為?只有1000個,可以隨便轉移。
0,9比較特殊,我預處理初狀態的時候特殊考慮,枚舉放幾個0放幾個9,只要個數和為偶數且0的個數多於9即可,後面的數確定了i的個數就可以確定9-i的個數了,可以直接轉移。
具體還要枚舉的加起來10的數的處理,看代碼吧。
1 //Achen
2 #include<algorithm>
3 #include<iostream>
4 #include<cstring>
5 #include<cstdlib>
6 #include<vector>
7 #include<cstdio>
8 #include<queue>
9 #include<cmath>
10 #include<set>
11 #include<map>
12 #define Formylove return 0
13 #define For(i,a,b) for(int i=(a);i<=(b);i++)
14 #define Rep(i,a,b) for(int i=(a);i>=(b);i--)
15 const int N=1e5+7,p=1e9+7;
16 typedef long long LL;
17 typedef double db;
18 using namespace std;
19 LL ans,fac[N],inv[N],f[6][1003];
20 int n,cnt[12],tot;
21 char s[N];
22
23 template<typename T>void read(T &x) {
24 char ch=getchar(); x=0; T f=1;
25 while(ch!=‘-‘&&(ch<‘0‘||ch>‘9‘)) ch=getchar();
26 if(ch==‘-‘) f=-1,ch=getchar();
27 for(;ch>=‘0‘&&ch<=‘9‘;ch=getchar()) x=x*10+ch-‘0‘; x*=f;
28 }
29
30 LL C(int n,int m) {
31 if(n<m) return 0;
32 return fac[n]*inv[m]%p*inv[n-m]%p;
33 }
34
35 #define ANS
36 int main() {
37 #ifdef ANS
38 freopen("count.in","r",stdin);
39 freopen("count.out","w",stdout);
40 #endif
41 scanf("%s",s);
42 n=strlen(s);
43 fac[0]=inv[0]=inv[1]=1;
44 For(i,1,n) fac[i]=fac[i-1]*i%p;
45 For(i,2,n) inv[i]=(p-p/i*inv[p%i]%p)%p;
46 For(i,2,n) inv[i]=inv[i-1]*inv[i]%p;
47 For(i,0,n-1) {
48 if(s[i]==‘?‘) tot++;
49 else cnt[s[i]-‘0‘]++;
50 }
51 For(sp,1,5) {
52 int t1=sp,t2=10-sp;
53 memset(f,0,sizeof(f));
54 For(i,0,tot) For(j,0,tot-i) { //i個0 j個9
55 if((cnt[0]+i<cnt[9]+j-(t2==9))||(t2==9&&cnt[9]+j==0)) continue;
56 if((cnt[0]+i+cnt[9]+j-(t2==9))%2==1) continue;
57 (f[0][i+j]+=C(tot,i)*C(tot-i,j)%p)%=p;
58 }
59 For(i,0,3) For(j,0,tot) if(f[i][j]) {
60 For(k,0,tot-j) {//k個i+1
61 int l=cnt[i+1]+k-(t1==i+1)-cnt[8-i]+(t2==8-i);
62 if(t1==t2) l=cnt[i+1]+k-cnt[8-i]+2*(t2==8-i);
63 if(l<0||l+k+j>tot) continue;
64 (f[i+1][j+k+l]+=f[i][j]*C(tot-j,k)%p*C(tot-j-k,l)%p)%=p;
65 }
66 }
67 ans=(ans+f[4][tot])%p;
68 }
69 printf("%lld\n",ans);
70 Formylove;
71 }
View Code
Problem C. sequence
我考場上的代碼完全瞎那啥在扯淡,我還以為自己能A,我怕不是是個智障哦
還沒改出來
NOIp2018集訓test-9-5(am)