Gym 101933

Posted qldabiaoge

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Gym 101933相关的知识,希望对你有一定的参考价值。

Gym 101933

B. Baby Bites水题直接模拟即可

 

技术图片
 1 #include <cstdio>
 2 #include <cstring>
 3 #include <queue>
 4 #include <cmath>
 5 #include <algorithm>
 6 #include <set>
 7 #include <iostream>
 8 #include <map>
 9 #include <stack>
10 #include <string>
11 #include <vector>
12 #define  pi acos(-1.0)
13 #define  eps 1e-9
14 #define  fi first
15 #define  se second
16 #define  rtl   rt<<1
17 #define  rtr   rt<<1|1
18 #define  bug         printf("******
")
19 #define  mem(a,b)    memset(a,b,sizeof(a))
20 #define  name2str(x) #x
21 #define  fuck(x)     cout<<#x" = "<<x<<endl
22 #define  f(a)        a*a
23 #define  sf(n)       scanf("%d", &n)
24 #define  sff(a,b)    scanf("%d %d", &a, &b)
25 #define  sfff(a,b,c) scanf("%d %d %d", &a, &b, &c)
26 #define  sffff(a,b,c,d) scanf("%d %d %d %d", &a, &b, &c, &d)
27 #define  pf          printf
28 #define  FRE(i,a,b)  for(i = a; i <= b; i++)
29 #define  FREE(i,a,b) for(i = a; i >= b; i--)
30 #define  FRL(i,a,b)  for(i = a; i < b; i++)+
31 #define  FRLL(i,a,b) for(i = a; i > b; i--)
32 #define  FIN         freopen("data.txt","r",stdin)
33 #define  gcd(a,b)    __gcd(a,b)
34 #define  lowbit(x)   x&-x
35 #define rep(i,a,b) for(int i=a;i<b;++i)
36 #define per(i,a,b) for(int i=a-1;i>=b;--i)
37 using namespace std;
38 typedef long long  LL;
39 typedef unsigned long long ULL;
40 const int INF = 0x3f3f3f3f;
41 const LL INFLL = 0x3f3f3f3f3f3f3f3fLL;
42 const int maxn = 1e5 + 10;
43 int n;
44 int main() {
45     sf ( n );
46     char op[10];
47     int flag = 1;
48     for ( int i = 1 ; i <= n ; i++ ) {
49         scanf ( "%s", op );
50         if ( op[0] >= 0 && op[0] <= 9 ) {
51             int temp = 0;
52             int len = strlen ( op );
53             for ( int j = 0 ; j < len ; j++ ) temp = temp * 10 + op[j] - 0;
54             if ( temp != i ) flag = 0;
55         }
56     }
57     if ( flag ) printf ( "makes sense
" );
58     else printf ( "something is fishy
" );
59     return 0;
60 }
View Code

 

C. Code Cleanups(难点)在于读题 读题读到自闭

题意: 给你一个数组a[ ]  表示a[ i ]产生一个垃圾,之后每天肮脏度增加1 ,肮脏度到达20时必须清理,问最少清理天数(注意每年的结束要将肮脏度变为0)

直接模拟即可

 

 

技术图片
 1 #include <cstdio>
 2 #include <cstring>
 3 #include <queue>
 4 #include <cmath>
 5 #include <algorithm>
 6 #include <set>
 7 #include <iostream>
 8 #include <map>
 9 #include <stack>
10 #include <string>
11 #include <vector>
12 #define  pi acos(-1.0)
13 #define  eps 1e-9
14 #define  fi first
15 #define  se second
16 #define  rtl   rt<<1
17 #define  rtr   rt<<1|1
18 #define  bug         printf("******
")
19 #define  mem(a,b)    memset(a,b,sizeof(a))
20 #define  name2str(x) #x
21 #define  fuck(x)     cout<<#x" = "<<x<<endl
22 #define  f(a)        a*a
23 #define  sf(n)       scanf("%d", &n)
24 #define  sff(a,b)    scanf("%d %d", &a, &b)
25 #define  sfff(a,b,c) scanf("%d %d %d", &a, &b, &c)
26 #define  sffff(a,b,c,d) scanf("%d %d %d %d", &a, &b, &c, &d)
27 #define  pf          printf
28 #define  FRE(i,a,b)  for(i = a; i <= b; i++)
29 #define  FREE(i,a,b) for(i = a; i >= b; i--)
30 #define  FRL(i,a,b)  for(i = a; i < b; i++)+
31 #define  FRLL(i,a,b) for(i = a; i > b; i--)
32 #define  FIN         freopen("data.txt","r",stdin)
33 #define  gcd(a,b)    __gcd(a,b)
34 #define  lowbit(x)   x&-x
35 #define rep(i,a,b) for(int i=a;i<b;++i)
36 #define per(i,a,b) for(int i=a-1;i>=b;--i)
37 using namespace std;
38 typedef long long  LL;
39 typedef unsigned long long ULL;
40 const int INF = 0x3f3f3f3f;
41 const LL INFLL = 0x3f3f3f3f3f3f3f3fLL;
42 const int maxn = 1e5 + 10;
43 int n, vis[maxn];
44 int main() {
45     sf ( n );
46     for ( int i = 0, x ; i < n ; i++ ) sf ( x ), vis[x] = 1;
47     int sum = 0, cnt = 0, ans = 0;
48     for ( int i = 1 ; i <= 365 ; i++ ) {
49         sum += cnt;
50         if ( sum >= 20 ) sum = 0, ans++, cnt = 0;
51         if ( vis[i] ) cnt++;
52     }
53     if ( cnt || sum ) ans++;
54     printf ( "%d
", ans );
55     return 0;
56 }
View Code

 

E. Explosion Exploit 记忆化搜索

题意:你有n个士兵,敌方有m个士兵,每一个士兵都有一定的血量(最大为6),如果血量归零,则证明该士兵死亡。现在有d点伤害,每一点伤害都会以等概率分配给任意一个人。现在问你,敌方的m个士兵全都阵亡的概率。

题解:总共只有12个士兵用一个long long 就可以存好状态了 当status<1000000时表示敌军已经死完了

这个概率是倒推过来的

Dfs(status,num)表示状态为status,剩下num点伤害,对方阵亡的概率

ans += ( double ) mp[i][j] / ( double ) sum * res;//表示转移到下一个状态的概率

 

 

 

技术图片
 1 #include <cstdio>
 2 #include <cstring>
 3 #include <queue>
 4 #include <cmath>
 5 #include <algorithm>
 6 #include <set>
 7 #include <iostream>
 8 #include <map>
 9 #include <stack>
10 #include <string>
11 #include <vector>
12 #include <bits/stdc++.h>
13 #define  pi acos(-1.0)
14 #define  eps 1e-9
15 #define  fi first
16 #define  se second
17 #define  rtl   rt<<1
18 #define  rtr   rt<<1|1
19 #define  bug         printf("******
")
20 #define  mem(a,b)    memset(a,b,sizeof(a))
21 #define  name2str(x) #x
22 #define  fuck(x)     cout<<#x" = "<<x<<endl
23 #define  f(a)        a*a
24 #define  sf(n)       scanf("%d", &n)
25 #define  sff(a,b)    scanf("%d %d", &a, &b)
26 #define  sfff(a,b,c) scanf("%d %d %d", &a, &b, &c)
27 #define  sffff(a,b,c,d) scanf("%d %d %d %d", &a, &b, &c, &d)
28 #define  pf          printf
29 #define  FRE(i,a,b)  for(i = a; i <= b; i++)
30 #define  FREE(i,a,b) for(i = a; i >= b; i--)
31 #define  FRL(i,a,b)  for(i = a; i < b; i++)+
32 #define  FRLL(i,a,b) for(i = a; i > b; i--)
33 #define  FIN         freopen("data.txt","r",stdin)
34 #define  gcd(a,b)    __gcd(a,b)
35 #define  lowbit(x)   x&-x
36 #define rep(i,a,b) for(int i=a;i<b;++i)
37 #define per(i,a,b) for(int i=a-1;i>=b;--i)
38 using namespace std;
39 typedef long long  LL;
40 typedef unsigned long long ULL;
41 const int INF = 0x3f3f3f3f;
42 const LL INFLL = 0x3f3f3f3f3f3f3f3fLL;
43 const int maxn = 2505;
44 const int mod = 1e9 + 7;
45 int n, m, d, mp[2][10];
46 unordered_map<LL, double>dp;
47 LL getstatus() {
48     LL temp = 0;
49     for ( int i = 1 ; i <= 6 ; i++ ) temp = temp * 10 + mp[1][i];
50     for ( int i = 1 ; i <= 6 ; i++ ) temp = temp * 10 + mp[0][i];
51     return temp;
52 }
53 double dfs ( LL status, int num ) {
54     if ( status < 1000000 ) return 1;
55     if ( num == 0 ) return 0;
56     if (dp.count(status)) return dp[status];
57     double ans = 0;
58     int sum = 0;
59     for ( int i = 0 ; i < 2 ; i++ )
60         for ( int j = 1 ; j <= 6 ; j++ ) sum += mp[i][j];
61     for ( int i = 0 ; i < 2 ; i++ ) {
62         for ( int j = 1 ; j <= 6 ; j++ ) {
63             if ( !mp[i][j] ) continue;
64             mp[i][j]--, mp[i][j - 1]++;
65             LL sta=getstatus();
66             double res = dfs ( sta, num - 1 );
67             dp[sta]=res;
68             mp[i][j - 1]--, mp[i][j]++;
69             ans += ( double ) mp[i][j] / ( double ) sum * res;
70         }
71     }
72     return ans;
73 }
74 
75 int main() {
76     sfff ( n, m, d );
77     for ( int i = 1, x ; i <= n ; i++ ) {
78         sf ( x );
79         mp[0][x]++;
80     }
81     for ( int i = 1, x; i <= m; i++ ) {
82         sf ( x );
83         mp[1][x]++;
84     }
85     double ans = dfs ( getstatus(), d );
86     printf ( "%.8f
", ans );
87     return 0 ;
88 }
View Code

 

 

H. House Lawn

有一个 l 平方米的草坪,给你 m 台割草机。选择其中一台,在一周(10080分钟)的时间内割完草坪。每台割草机输入格式为:“名字,价格,割草效率,工作时间,充电时间” ;

要求选出价格最低的满足条件的一台,如果有多台满足条件且价格相同,按照输入顺序输出割草机名字。

一开始我以为只要一周内可以完成一次就好了,然后拿int写的,后面仔细看题要保证T周也必须清理T次,用int写的话你这周可以清理完,但是下周不一定。所有这题的就相当于充t分钟电能给割草(t/充电时间)*割草时间 所以用double写这题

 

 

技术图片
 1 #include <cstdio>
 2 #include <cstring>
 3 #include <queue>
 4 #include <cmath>
 5 #include <algorithm>
 6 #include <set>
 7 #include <iostream>
 8 #include <map>
 9 #include <stack>
10 #include <string>
11 #include <vector>
12 #define  pi acos(-1.0)
13 #define  eps 1e-9
14 #define  fi first
15 #define  se second
16 #define  rtl   rt<<1
17 #define  rtr   rt<<1|1
18 #define  bug         printf("******
")
19 #define  mem(a,b)    memset(a,b,sizeof(a))
20 #define  name2str(x) #x
21 #define  fuck(x)     cout<<#x" = "<<x<<endl
22 #define  f(a)        a*a
23 #define  sf(n)       scanf("%d", &n)
24 #define  sff(a,b)    scanf("%d %d", &a, &b)
25 #define  sfff(a,b,c) scanf("%d %d %d", &a, &b, &c)
26 #define  sffff(a,b,c,d) scanf("%d %d %d %d", &a, &b, &c, &d)
27 #define  pf          printf
28 #define  FRE(i,a,b)  for(i = a; i <= b; i++)
29 #define  FREE(i,a,b) for(i = a; i >= b; i--)
30 #define  FRL(i,a,b)  for(i = a; i < b; i++)+
31 #define  FRLL(i,a,b) for(i = a; i > b; i--)
32 #define  FIN         freopen("data.txt","r",stdin)
33 #define  gcd(a,b)    __gcd(a,b)
34 #define  lowbit(x)   x&-x
35 #define rep(i,a,b) for(int i=a;i<b;++i)
36 #define per(i,a,b) for(int i=a-1;i>=b;--i)
37 using namespace std;
38 typedef long long  LL;
39 typedef unsigned long long ULL;
40 const int INF = 0x3f3f3f3f;
41 const LL INFLL = 0x3f3f3f3f3f3f3f3fLL;
42 const int maxn = 1e2 + 5;
43 string s[maxn], s1;
44 LL a[maxn], l, n, cnt[10], vis[maxn];
45 int main() {
46     //  FIN;
47     cin >> l >> n;
48     getchar();
49     int ans = INF;
50     for ( int i = 0; i < n ; i++ ) {
51         getline ( cin, s1 );
52         int flag = 0, temp;
53         for ( int j = 0 ; j < s1.size() ; j++ ) {
54             if ( s1[j] == , ) flag++, cnt[flag] = temp, temp = 0;
55             else if ( !flag ) s[i] += s1[j];
56             else  temp = temp * 10 + s1[j] - 0;
57         }
58         cnt[++flag] = temp;
59         a[i] = cnt[2];
60 //        int num = 10080 / ( cnt[4] + cnt[5] ), res = 10080 % ( cnt[4] + cnt[5] );
61 //        for (int i=2 ;i<=5 ;i++) printf("%d%c",cnt[i],i==5?‘
‘:‘ ‘);
62 //        printf ( "num = %d res = %d
", num, res );
63 //        LL sum = 0;
64 //        if ( res >= cnt[4] ) sum = 1LL * ( num + 1 ) * 1LL * cnt[4] * 1LL * cnt[3];
65 //        if ( res < cnt[4] ) sum = 1LL * num * 1LL * cnt[4] * 1LL * cnt[3] + 1LL * res * 1LL * cnt[3];
66         if ( ( double ) ( ( double ) 10080 / ( ( double ) ( cnt[4] + cnt[5] ) ) * ( double ) cnt[3] * ( double ) cnt[4]  ) >=  1.0 * l && ans >= a[i] ) ans = cnt[2],vis[i]=1;
67     }
68     if ( ans == INF ) printf ( "no such mower
" );
69     for ( int i = 0 ; i < n ; i++ ) if ( ans == a[i] && vis[i]) cout << s[i] << endl;
70     return 0;
71 }
View Code

 

 

Intergalactic Bidding

有n个人的名字和值,每个人的值相差两倍以上,问是否有一种方案使部分人的值加起来为S 

大数直接模拟就好了(相差2倍以上,只有唯一解)

 

技术图片
  1 #include <cstdio>
  2 #include <cstring>
  3 #include <queue>
  4 #include <cmath>
  5 #include <algorithm>
  6 #include <set>
  7 #include <iostream>
  8 #include <map>
  9 #include <stack>
 10 #include <string>
 11 #include <vector>
 12 #define  pi acos(-1.0)
 13 #define  eps 1e-9
 14 #define  fi first
 15 #define  se second
 16 #define  rtl   rt<<1
 17 #define  rtr   rt<<1|1
 18 #define  bug         printf("******
")
 19 #define  mem(a,b)    memset(a,b,sizeof(a))
 20 #define  name2str(x) #x
 21 #define  fuck(x)     cout<<#x" = "<<x<<endl
 22 #define  f(a)        a*a
 23 #define  sf(n)       scanf("%d", &n)
 24 #define  sff(a,b)    scanf("%d %d", &a, &b)
 25 #define  sfff(a,b,c) scanf("%d %d %d", &a, &b, &c)
 26 #define  sffff(a,b,c,d) scanf("%d %d %d %d", &a, &b, &c, &d)
 27 #define  pf          printf
 28 #define  FRE(i,a,b)  for(i = a; i <= b; i++)
 29 #define  FREE(i,a,b) for(i = a; i >= b; i--)
 30 #define  FRL(i,a,b)  for(i = a; i < b; i++)+
 31 #define  FRLL(i,a,b) for(i = a; i > b; i--)
 32 #define  FIN         freopen("data.txt","r",stdin)
 33 #define  gcd(a,b)    __gcd(a,b)
 34 #define  lowbit(x)   x&-x
 35 #define rep(i,a,b) for(int i=a;i<b;++i)
 36 #define per(i,a,b) for(int i=a-1;i>=b;--i)
 37 using namespace std;
 38 typedef long long  LL;
 39 typedef unsigned long long ULL;
 40 const int INF = 0x3f3f3f3f;
 41 const LL INFLL = 0x3f3f3f3f3f3f3f3fLL;
 42 const int MAXL = 2500;
 43 const int MAXN = 9999;
 44 const int DLEN = 4;
 45 class Big {
 46 public:
 47     int a[MAXL], len;
 48     Big ( const int b = 0 ) {
 49         int c, d = b;
 50         len = 0;
 51         memset ( a, 0, sizeof ( a ) );
 52         while ( d > MAXN ) {
 53             c = d - ( d / ( MAXN + 1 ) ) * ( MAXN + 1 );
 54             d = d / ( MAXN + 1 );
 55             a[len++] = c;
 56         }
 57         a[len++] = d;
 58     }
 59     Big ( const char *s ) {
 60         int t, k, index, L;
 61         memset ( a, 0, sizeof ( a ) );
 62         L = strlen ( s );
 63         len = L / DLEN;
 64         if ( L % DLEN ) len++;
 65         index = 0;
 66         for ( int i = L - 1; i >= 0; i -= DLEN ) {
 67             t = 0;
 68             k = i - DLEN + 1;
 69             if ( k < 0 ) k = 0;
 70             for ( int j = k; j <= i; j++ ) t = t * 10 + s[j] - 0;
 71             a[index++] = t;
 72         }
 73     }
 74     Big operator/ ( const LL &b ) const {
 75         Big ret;
 76         LL down = 0;
 77         for ( int i = len - 1; i >= 0; i-- ) {
 78             ret.a[i] = ( a[i] + down * ( MAXN + 1 ) ) / b;
 79             down = a[i] + down * ( MAXN + 1 ) - ret.a[i] * b;
 80         }
 81         ret.len = len;
 82         while ( ret.a[ret.len - 1] == 0 && ret.len > 1 ) ret.len--;
 83         return ret;
 84     }
 85     bool operator> ( const Big &T ) const {
 86         int ln;
 87         if ( len > T.len ) return true;
 88         else if ( len == T.len ) {
 89             ln = len - 1;
 90             while ( a[ln] == T.a[ln] && ln >= 0 ) ln--;
 91             if ( ln >= 0 && a[ln] > T.a[ln] ) return true;
 92             else return false;
 93         } else return false;
 94     }
 95     Big operator+ ( const Big &T ) const {
 96         Big t ( *this );
 97         int big = T.len > len ? T.len : len;
 98         for ( int i = 0; i < big; i++ ) {
 99             t.a[i] += T.a[i];
100             if ( t.a[i] > MAXN ) {
101                 t.a[i + 1]++;
102                 t.a[i] -= MAXN + 1;
103             }
104         }
105         if ( t.a[big] != 0 ) t.len = big + 1;
106         else t.len = big;
107         return t;
108     }
109     Big operator- ( const Big &T ) const {
110         int big;
111         bool flag;
112         Big t1, t2;
113         if ( *this > T ) {
114             t1 = *this;
115             t2 = T;
116             flag = 0;
117         } else {
118             t1 = T;
119             t2 = *this;
120             flag = 1;
121         }
122         big = t1.len;
123         for ( int i = 0; i < big; i++ ) {
124             if ( t1.a[i] < t2.a[i] ) {
125                 int j = i + 1;
126                 while ( t1.a[j] == 0 ) j++;
127                 t1.a[j--]--;
128                 while ( j > i ) t1.a[j--] += MAXN;
129                 t1.a[i] += MAXN + 1 - t2.a[i];
130             } else t1.a[i] -= t2.a[i];
131         }
132         t1.len = big;
133         while ( t1.a[t1.len - 1] == 0 && t1.len > 1 ) {
134             t1.len--;
135             big--;
136         }
137         if ( flag ) t1.a[big - 1] = 0 - t1.a[big - 1];
138         return t1;
139     }
140     LL operator% ( const int &b ) const {
141         LL d = 0;
142         for ( int i = len - 1; i >= 0; i-- ) d = ( ( d * ( MAXN + 1 ) ) % b + a[i] ) % b;
143         return d;
144     }
145     Big operator* ( const Big &T ) const {
146         Big ret;
147         int i, j, up, temp, temp1;
148         for ( i = 0; i < len; i++ ) {
149             up = 0;
150             for ( j = 0; j < T.len; j++ ) {
151                 temp = a[i] * T.a[j] + ret.a[i + j] + up;
152                 if ( temp > MAXN ) {
153                     temp1 = temp - temp / ( MAXN + 1 ) * ( MAXN + 1 );
154                     up = temp / ( MAXN + 1 );
155                     ret.a[i + j] = temp1;
156                 } else {
157                     up = 0;
158                     ret.a[i + j] = temp;
159                 }
160             }
161             if ( up != 0 )  ret.a[i + j] = up;
162         }
163         ret.len = i + j;
164         while ( ret.a[ret.len - 1] == 0 && ret.len > 1 ) ret.len--;
165         return ret;
166     }
167     void print() {
168         printf ( "%d", a[len - 1] );
169         for ( int i = len - 2; i >= 0; i-- ) printf ( "%04d", a[i] );
170     }
171 };
172 int n;
173 struct node {
174     char name[101];
175     char num[2010];
176 } qu[MAXL];
177 int cmp ( node  s1, node s2 ) {
178     int len1 = strlen ( s1.num ), len2 = strlen ( s2.num );
179     if ( len2 > len1 ) return 1;
180     else if ( len2 < len1 ) return 0;
181     else {
182         for ( int i = 0 ; i < len1 ; i++ )
183             if ( s2.num[i] < s1.num[i] )  return 0;
184             else if ( s2.num[i] > s1.num[i] ) return 1;
185     }
186 }
187 char sum[2010];
188 Big s, a[MAXL];
189 vector<int>ans;
190 int main() {
191     scanf ( "%d%s", &n, sum );
192     s = sum;
193     for ( int i = 0 ; i < n ; i++ ) scanf ( "%s%s", qu[i].name, qu[i].num ) ;
194     sort ( qu, qu + n, cmp );
195     //for ( int i = 0 ; i < n ; i++ ) printf ( "%s %s
", qu[i].name, qu[i].num );
196     for ( int i = 0 ; i < n ; i++ ) a[i] = qu[i].num;
197     int flag = 0;
198     for ( int i = n - 1 ; i >= 0 ; i-- ) {
199         // a[i].print(), printf ( " " ), s.print(), printf ( "
" );
200         if ( a[i] > s ) continue;
201         else if ( s > a[i] ) {
202             s = s - a[i];
203             ans.push_back ( i );
204         } else {
205             ans.push_back ( i );
206             flag = 1;
207             break;
208         }
209     }
210     if ( !flag )  printf ( "0
" );
211     else {
212         printf ( "%d
", ans.size() );
213         for ( int i = 0 ; i < ans.size() ; i++ )
214             printf ( "%s
", qu[ans[i]].name );
215     }
216     return 0;
217 }
View Code

 

J. Jumbled String

有a个00子顺序串,b个01,c个10,d个11,构造01串

注意一点当全部等于0的时候要输出0或者1

还有a==0 ,0的个数有0或者1个 ,d==0 同理

我的构造是111100001111 然后再0之中插入一个1构造01和10

 

技术图片
 1 #include <cstdio>
 2 #include <cstring>
 3 #include <queue>
 4 #include <cmath>
 5 #include <algorithm>
 6 #include <set>
 7 #include <iostream>
 8 #include <map>
 9 #include <stack>
10 #include <string>
11 #include <vector>
12 #define  pi acos(-1.0)
13 #define  eps 1e-9
14 #define  fi first
15 #define  se second
16 #define  rtl   rt<<1
17 #define  rtr   rt<<1|1
18 #define  bug         printf("******
")
19 #define  mem(a,b)    memset(a,b,sizeof(a))
20 #define  name2str(x) #x
21 #define  fuck(x)     cout<<#x" = "<<x<<endl
22 #define  f(a)        a*a
23 #define  sf(n)       scanf("%d", &n)
24 #define  sff(a,b)    scanf("%d %d", &a, &b)
25 #define  sfff(a,b,c) scanf("%d %d %d", &a, &b, &c)
26 #define  sffff(a,b,c,d) scanf("%d %d %d %d", &a, &b, &c, &d)
27 #define  pf          printf
28 #define  FRE(i,a,b)  for(i = a; i <= b; i++)
29 #define  FREE(i,a,b) for(i = a; i >= b; i--)
30 #define  FRL(i,a,b)  for(i = a; i < b; i++)+
31 #define  FRLL(i,a,b) for(i = a; i > b; i--)
32 #define  FIN         freopen("data.txt","r",stdin)
33 #define  gcd(a,b)    __gcd(a,b)
34 #define  lowbit(x)   x&-x
35 #define rep(i,a,b) for(int i=a;i<b;++i)
36 #define per(i,a,b) for(int i=a-1;i>=b;--i)
37 using namespace std;
38 typedef long long  LL;
39 typedef unsigned long long ULL;
40 const int INF = 0x3f3f3f3f;
41 const LL INFLL = 0x3f3f3f3f3f3f3f3fLL;
42 const int maxn = 1e2 + 5;
43 map<LL, int>mp;
44 LL a, b, c, d;
45 int main() {
46     for ( int i = 2 ; i <= 100001 ; i++ ) mp[ ( i - 1 ) *i / 2] = i;
47     scanf ( "%lld%lld%lld%lld", &a, &b, &c, &d );
48     int num0 = mp[a], num1 = mp[d];
49     if ( a == 0 && b == 0 && c == 0 && d == 0 )  return 0 * printf ( "1
" );
50     if ( ( num0 == 0 && a != 0 ) || ( num1 == 0 && d != 0 ) ) return 0 * printf ( "impossible
" );
51     if ( num0 == 0 && ( b || c ) ) num0 = 1;
52     if ( num1 == 0 && ( b || c ) ) num1 = 1;
53     if ( num0 * num1 != b + c ) return 0 * printf ( "impossible
" );
54     if ( num0 == 0 && b == 0 && c == 0 ) {
55         for ( int i = 0 ; i < num1 ; i++ ) printf ( "1" );
56         printf ( "
" );
57         return 0;
58     }
59     if ( num1 == 0 && b == 0 && c == 0 ) {
60         for ( int i = 0 ; i < num0 ; i++ ) printf ( "0" );
61         printf ( "
" );
62         return 0;
63     }
64     //printf ( "num0 = %d num1 = %d
", num0, num1 );
65     int cnt = c / num0, res = c % num0;
66     for ( int i = 0 ; i < cnt ; i++ ) printf ( "1" );
67     for ( int i = 0 ; i < num0 - max ( res - ( res == 0 ), 0 ) ; i++ ) printf ( "0" );
68     if ( res != 0 )  printf ( "1" ), num1--;
69     for ( int i = 0; i < max ( res - ( res == 0 ), 0 ) ; i++ ) printf ( "0" );
70     for ( int i = cnt ; i < num1 ; i++ ) printf ( "1" );
71     printf ( "
" );
72     return 0;
73 }
View Code

 

 

K. King‘s Colors

给你一颗树有n个节点,用K种颜色染色,必要用完K种颜色,问方案数

第一次遇到容斥的题目,表示很不会

全部的方案为k*(k-1)^(n-1)-(k-1)*(k-1-1)^ (n-1)+ (k-2)*(k-2-1)^ (n-1)+……

我第一次看到这个式子很懵逼 后面解释是k*(k-1)^(n-1)这个包含了用了k-1的颜色的情况所以要减去

我第一次感觉减去这个就够了,但是这个式子还+上了k-2的颜色的情况  (我第一次想的时候k*(k-1)^(n-1)也包含了k-2的颜色的情况 为什么这里还要加上  直接减去不就好了)

然后我直接手写了一个4个节点和4种颜色的情况弄懂了

所有情况4*3*3*3 – 3*2*2*C(4,3)+C(4,2)*2*1*1*1

看3*2*2*C(4,3)这一项 选择3种颜色的方案数,这个里面包含了选择2种颜色的情况

假设抽出这3种颜色这里的两种颜色为

1 2 3 为 (1,2)(1,3),(2,3)

1 3 4 为 (1,3)(1,4),(3,4)

1 2 4 为 (1,2)(1,4),(2,4)

2 3 4 为 (2,3)(2,4),(3,4)

然后你会发现用了两种颜色的刚好多被减了一次,所以要加上

 

 

技术图片
 1 #include <cstdio>
 2 #include <cstring>
 3 #include <queue>
 4 #include <cmath>
 5 #include <algorithm>
 6 #include <set>
 7 #include <iostream>
 8 #include <map>
 9 #include <stack>
10 #include <string>
11 #include <vector>
12 #define  pi acos(-1.0)
13 #define  eps 1e-9
14 #define  fi first
15 #define  se second
16 #define  rtl   rt<<1
17 #define  rtr   rt<<1|1
18 #define  bug         printf("******
")
19 #define  mem(a,b)    memset(a,b,sizeof(a))
20 #define  name2str(x) #x
21 #define  fuck(x)     cout<<#x" = "<<x<<endl
22 #define  f(a)        a*a
23 #define  sf(n)       scanf("%d", &n)
24 #define  sff(a,b)    scanf("%d %d", &a, &b)
25 #define  sfff(a,b,c) scanf("%d %d %d", &a, &b, &c)
26 #define  sffff(a,b,c,d) scanf("%d %d %d %d", &a, &b, &c, &d)
27 #define  pf          printf
28 #define  FRE(i,a,b)  for(i = a; i <= b; i++)
29 #define  FREE(i,a,b) for(i = a; i >= b; i--)
30 #define  FRL(i,a,b)  for(i = a; i < b; i++)+
31 #define  FRLL(i,a,b) for(i = a; i > b; i--)
32 #define  FIN         freopen("data.txt","r",stdin)
33 #define  gcd(a,b)    __gcd(a,b)
34 #define  lowbit(x)   x&-x
35 #define rep(i,a,b) for(int i=a;i<b;++i)
36 #define per(i,a,b) for(int i=a-1;i>=b;--i)
37 using namespace std;
38 typedef long long  LL;
39 typedef unsigned long long ULL;
40 const int INF = 0x3f3f3f3f;
41 const LL INFLL = 0x3f3f3f3f3f3f3f3fLL;
42 const int maxn = 2505;
43 const int mod = 1e9 + 7;
44 int n, k, C[maxn][maxn];
45 LL exp_mod ( LL a, LL b ) {
46     LL ret = 1;
47     while ( b ) {
48         if ( b & 1 ) ret = ret * a % mod;
49         a = a * a % mod;
50         b = b >> 1;
51     }
52     return ret % mod;
53 }
54 int main() {
55     C[0][0] = 1, C[0][1] = 0;
56     for ( int i = 1 ; i <= 2500 ; i++ ) {
57         C[i][0] = 1, C[i][i + 1] = 0;
58         for ( int j = 1 ; j <= i ; j++ )
59             C[i][j] = ( C[i - 1][j - 1] + C[i - 1][j] ) % mod;
60     }
61     sff ( n, k );
62     for ( int i = 1, u ; i < n ; i++ ) sf ( u );
63     LL ans = 0;
64     for ( int i = k ; i >= 2 ; i-- )
65         if ( ( k - i ) % 2 == 0 ) ans = ( ans + 1LL * i * exp_mod ( i - 1, n - 1 ) % mod * C[k][i] % mod ) % mod;
66         else ans = ( ans - 1LL * i * exp_mod ( i - 1, n - 1 ) % mod * C[k][i] % mod + mod ) % mod;
67     printf ( "%lld
", ans );
68 }
View Code

 

以上是关于Gym 101933的主要内容,如果未能解决你的问题,请参考以下文章

GYM 101933I(贪心大整数)

GYM 101933E(记忆化搜索)

GYM 101933A(dp)

CF gym 101933 K King's Colors —— 二项式反演

Gym 101933 King's Colors

Gym .101933 Nordic Collegiate Programming Contest (NCPC 2018) (寒假gym自训第四场)