以下所有AC题解程序来自“仙客传奇”团队。 AC题数:7/13 ABCFGJL
AC的C++语言程序:
#include <bits/stdc++.h>
#define lo(i, n, m) for (int i = n; i < m; i++)
#define loe(i, n, m) for (int i = n; i <= m; i++)
#define rlo(i, n, m) for (int i = n - 1; i >= m; i--)
#define rloe(i, n, m) for (int i = n; i >= m; i--)
#define scd(x) scanf("%d", &x)
#define clr(a, b) memset((a), (b), sizeof(a))
using namespace std;
const int LIM = 110;
const int MOD = 10007;
int dp[2][531441]; // 531441 is pow(3, 12)
int inval[LIM];
int state[LIM], dir[3] = {1};
int ts = 0;
int T, n, p, k, t, len, lim;
// state compressing
inline int code() {
int ret = 0;
lo(i, 0, len) ret = ret * 3 + state[i];
return ret;
}
// state decompressing
inline void rcode(int cd) {
rlo(i, len, 0) state[i] = cd % 3, cd /= 3;
}
// erase the state of (i-p-2)th point which is useless for point (i + 1)
inline void evolution() {
rlo(i, len, 1) state[i] = state[i - 1];
state[0] = 0;
}
int main() {
scd(T);
loe(_, 1, T) {
++ts;
scd(n), scd(p), scd(k);
dir[1] = p, dir[2] = p + 2;
lo(i, 0, k) scd(t), inval[t] = ts;
len = p + 3;
lo(i, 0, len) state[i] = 2;
int _pos = 0;
clr(dp[_pos], 0);
dp[_pos][lim = code()] = 1;
lo(i, 0, n) {
clr(dp[1 - _pos], 0);
loe(j, 0, lim) {
if (!dp[_pos][j]) continue;
rcode(j);
evolution();
if (inval[i + 1] == ts) {
// if i + 1 is the invalid point
state[0] = 2;
if (state[p + 2] == 2) t = code(), dp[1 - _pos][t] = (dp[1 - _pos][t] + dp[_pos][j]) % MOD;
} else {
// if i + 1 is an exist point
// try to create no edge
state[0] = 0;
if (state[p + 2] == 2) t = code(), dp[1 - _pos][t] = (dp[1 - _pos][t] + dp[_pos][j]) % MOD;
// try to create one edges
state[0] = 1;
lo(k, 0, 3) {
if (state[dir[k]] == 2) continue;
++state[dir[k]];
if (state[p + 2] == 2) t = code(), dp[1 - _pos][t] = (dp[1 - _pos][t] + dp[_pos][j]) % MOD;
--state[dir[k]];
}
// try to create two edges
state[0] = 2;
lo(k, 0, 2) lo(w, k + 1, 3) {
if (state[dir[k]] == 2 || state[dir[w]] == 2) continue;
++state[dir[k]], ++state[dir[w]];
if (state[p + 2] == 2) t = code(), dp[1 - _pos][t] = (dp[1 - _pos][t] + dp[_pos][j]) % MOD;
--state[dir[k]], --state[dir[w]];
}
}
}
_pos = 1 - _pos;
}
printf("Case #%d: %d\n", _, dp[_pos][lim]);
}
return 0;
}
// 参考了:https://blog.youkuaiyun.com/johsnows/article/details/77511974
// 定义集合S的元素为二元组(x, y),其中x表示公园的标识,y表示这个点的度
// (之后将使用dp(i, S)来表示一个状态)
// 显然最后构成的结果要求所有点的度都是2
// 对于每个点i的度数,仅有与它距离为1、p、p + 2的点的度数与它相关,
// 如果把相关性的控制放在标识较大的点上,即点i仅影响与i - 1、i - p、i - p - 2点的度数,
// 相应地,i + 1、i + p、i + p + 2来控制对i点度数的影响。
// 对于点i,使用集合S来存储从i - p - 2到i点的度数,考虑点i + 1,
// 对于i + 1,集合S应当去掉i + 1 - p - 3这个点(因为点i + 1不会影响到这个点的度数,且对之后的点也没有影响)
// 相应地添加上i + 1这个点,此时S调整成对应到i + 1这个点的S,
// 先忽略题目中关于无效点的描述,则对于i + 1这个点它有三种选择:
// 暂时不进行连边、添加1条边、添加2条边,(特别地,应当约束一下添加上边后没有点的度数会超过2)。
// 这样就可以完成dp计数,接着考虑添加上无效的点。
// 对于无效的点,不进行连边,但是假设它的度数为2(防止因为它的缘故被漏记一些合法情况)。
题解链接:
hdu 5450 Traversal(状压dp)
hdu 5450 Traversal(状压dp)
B. Best Solver
AC的C++语言程序:
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e7 + 2;
typedef long long ll;
ll x , m;
ll f[MAXN + 3], p, emmm[MAXN + 3];
ll pow(ll x , ll n, ll mo) {
if (n == 0) return 1;
ll t = pow(x , n/2, mo);
if (n & 1) return t * t % mo * x % mo;
else return t * t % mo;
}
int main() {
int T;
scanf("%d", &T);
memset(emmm, -1, sizeof(emmm));
for (int cas = 1; cas <= T; cas++) {
scanf("%lld%lld", &x, &m);
f[0] = 2 % m;
f[1] = 10 % m;
if (emmm[m] == -1) {
for (int i = 2;; i++) {
f[i] = (f[i-1] * 10 % m- f[i -2] % m + m) % m;
if (f[i] == f[1] && f[i-1] == f[0]) {
p = i - 1;
break;
}
}
emmm[m] = p;
//cout << "HERE" << endl;
}
p = emmm[m];
ll r = ((pow(2, x, p) + 1) %p + p) %p;
f[0] = 2 % m;
f[1] = 10 % m;
for (int i = 2; i <= r; i++) {
f[i] = (f[i-1] * 10 % m- f[i -2] % m + m) % m;
}
//cout << "HERE" << endl;
ll ans =( (f[r] - 1) % m + m ) % m;
printf("Case #%d: %lld\n", cas, ans );
}
}
C. Minimum Cut
AC的C++语言程序:
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2e4 + 2;
const int MAXM = 2e5 + 2;
int dutr[MAXN] , dug[MAXN];
const int INF =0x3f3f3f3f;
int ans;
int main() {
int T;
scanf("%d", &T);
for (int cas = 1; cas <= T; cas++){
memset(dutr, 0, sizeof(dutr));
memset(dug, 0, sizeof(dug));
int n , m;
scanf("%d%d", &n, &m);
for (int i = 0; i < n - 1;i++){
int u ,v;
scanf("%d%d", &u,&v);
dutr[u]++;
dutr[v]++;
}
for (int i =0; i < m- n+1;i++){
int u, v;
scanf("%d%d", &u,&v);
dug[u]++;
dug[v]++;
}
ans = INF;
for (int i = 1; i <= n;i++){
if (dutr[i] == 1){
ans = min(ans, dug[i] + 1);
}
}
printf("Case #%d: %d\n",cas, ans);
}
return 0;
}
AC的C++语言程序:
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <queue>
#include <stack>
#include <algorithm>
#include <set>
#include <map>
#define lo(i, n, m) for (int i = n; i < m; i++)
#define loe(i, n, m) for (int i = n; i <= m; i++)
#define rlo(i, n, m) for (int i = n - 1; i >= m; i--)
#define rloe(i, n, m) for (int i = n; i >= m; i--)
#define pb push_back
#define mk make_pair
#define clr(a, b) memset((a), (b), sizeof(a))
typedef long long LL;
using namespace std;
// const int INF = 0x3f3f3f3f;
const int INF = 0x7fffffff;
// const LL INF = 0x3f3f3f3f3f3f3f3f;
// const LL INF = 0x7fffffffffffffff;
const int NIL = -1;
template <class T>
inline T mx(T a, T b) {return a > b ? a : b;}
template <class T>
inline T mi(T a, T b) {return a < b ? a : b;}
template <class T>
inline void sw(T &a, T &b) {
T t = a; a = b; b = t;
}
template <class T>
inline T mabs(T x) {return x < 0 ? -x : x;}
inline char gc() {
char ret;
while ((ret = getchar()) == ' ' || ret == '\n' || ret == '\t');
return ret;
}
const int LIM = 2e4 + 10;
int deg1[LIM], deg2[LIM];
int main() {
// ios::sync_with_stdio(false);
// cin.tie(NULL), cout.tie(NULL);
int t, n, m, u, v;
scanf("%d", &t);
loe(k, 1, t) {
scanf("%d%d", &n, &m);
clr(deg1, 0), clr(deg2, 0);
lo(i, 1, n) scanf("%d%d", &u, &v), deg1[u]++, deg1[v]++;
loe(i, n, m) scanf("%d%d", &u, &v), deg2[u]++, deg2[v]++;
int ans = INF;
loe(i, 1, n) if (deg1[i] == 1) ans = mi(ans, 1 + deg2[i]);
printf("Case #%d: %d\n", k, ans);
}
return 0;
}
D. Dividing This Product
题解链接:
hdu 5453 Dividing This Product(分块打表)
E. Excited Database
题解链接:
HDU 5454 Excited Database (2015年沈阳赛区网络赛E题)
HDU 5454 Excited Database【线段树】
hdu 5454 Excited Database(线段树)
F. Fang Fang
AC的C++语言程序:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<string>
#include<queue>
#include<map>
#include<set>
#include<list>
#include<ctime>
#include<ctype.h>
#include<stdlib.h>
#include<bitset>
#include<algorithm>
#include<numeric> //accumulate
#define endl "\n"
#define fi first
#define se second
#define FOR(i,s,t) for(int i=(s);i<=(t);++i)
#define mem(a,b) memset(a,b,sizeof(a))
#define rush() int T;scanf("%d",&T);while(T--)
using namespace std;
const int maxn=2000000+5;
int n;
char s[maxn];
int check()
{
int pos=0;
while(s[pos]=='f')
pos++;
int st=pos;
while(pos--)
{
s[n++]='f';
}
int ans=0;
for(int i=st; i<n; i++)
{
if(s[i]=='f')
{
int j=i+1;
while(j<n&&s[i]==s[j])
j++;
ans+=(j-i)/2;
if((j-i)&1)
ans++;
i=j-1;
}
else if(s[i]=='c')
{
int j=i+1;
if(s[j]!='f')
return -1;
while(j<n&&s[i+1]==s[j])
j++;
if(j-i<3)
return -1;
ans++;
i=j-1;
}
else
return -1;
}
return ans;
}
int main()
{
//cin.tie(0);
//cout.tie(0);
//ios_base::sync_with_stdio(false);
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int cas=0;
rush()
{
scanf(" %s",s);
int cnt=0;
n=strlen(s);
printf("Case #%d: %d\n",++cas,check());
}
return 0;
}
/*
int read()
{
char c = getchar();
int x = 0;
for (; (c < 48 || c>57); c = getchar());
for (; c > 47 && c < 58; c = getchar())
{
x = (x << 1) + (x << 3) + c - 48;
}
return x;
}
*/
AC的C++语言程序:
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e6 + 5;
char a[MAXN];
int cntf, ans;
int main() {
int n;
cin >> n;
getchar();
for (int i = 0; i< n;i++){
printf("Case #%d: ", i + 1);
gets(a);
int flag1 = 1;
for (int j = 0; j < strlen(a); j++)
if (a[j] != 'c' && a[j] != 'f'){
puts("-1");
flag1 = 0;
break;
}
if (!flag1) continue;
int j= 0;
while (a[j] == 'f' && j < strlen(a)) j++;
if (j == strlen(a) && a[j-1] != 'c') {
printf("%d\n", strlen(a) / 2 + strlen(a) % 2);
continue;
}
int pos = j, flag = 1;
j++;
if (j == strlen(a)) j = 0;
cntf = 0;ans = 0;
while (j != pos){
if (a[j] == 'c'){
if (cntf < 2) {
flag = 0;
break;
}else ans++;
cntf = 0;
}else cntf++;
j++;
if (j == strlen(a)) j = 0;
}
if (cntf >= 2) ans++;
else flag = 0;
if (flag) printf("%d\n", ans);
else printf("-1\n");
}
return 0;
}
AC的C++语言程序:
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <queue>
#include <stack>
#include <algorithm>
#include <set>
#include <map>
#define lo(i, n, m) for (int i = n; i < m; i++)
#define loe(i, n, m) for (int i = n; i <= m; i++)
#define rlo(i, n, m) for (int i = n - 1; i >= m; i--)
#define rloe(i, n, m) for (int i = n; i >= m; i--)
#define pb push_back
#define mk make_pair
#define clr(a, b) memset((a), (b), sizeof(a))
typedef long long LL;
using namespace std;
// const int INF = 0x3f3f3f3f;
// const int INF = 0x7fffffff;
// const LL INF = 0x3f3f3f3f3f3f3f3f;
// const LL INF = 0x7fffffffffffffff;
const int NIL = -1;
template <class T>
inline T mx(T a, T b) {return a > b ? a : b;}
template <class T>
inline T mi(T a, T b) {return a < b ? a : b;}
template <class T>
inline void sw(T &a, T &b) {
T t = a; a = b; b = t;
}
template <class T>
inline T mabs(T x) {return x < 0 ? -x : x;}
inline char gc() {
char ret;
while ((ret = getchar()) == ' ' || ret == '\n' || ret == '\t');
return ret;
}
const int LIM = 1e6 + 10;
char str[LIM];
int main() {
// ios::sync_with_stdio(false);
// cin.tie(NULL), cout.tie(NULL);
int n;
scanf("%d", &n);
getchar();
loe(k, 1, n) {
// scanf("%s", str);
gets(str);
int len = strlen(str);
if (!len) {
printf("Case #%d: ", k);
printf("0\n");
continue;
}
bool flag = true;
lo(i, 0, len) if (str[i] != 'c' && str[i] != 'f') {flag = false; break;}
if (!flag) {
printf("Case #%d: ", k);
printf("-1\n");
continue;
}
flag = true;
lo(i, 0, len) if (str[i] == 'c') {flag = false; break;}
printf("Case #%d: ", k);
if (flag) {
printf("%d\n", len / 2 + len % 2);
} else {
flag = true;
int cnt = 0;
int cur = 0, ans = 0;
lo(i, 0, len) if (str[i] == 'c') {cur = i; break;}
cur = (cur + 1) % len;
lo(i, 0, len) {
if (str[cur] == 'c') {
if (cnt < 2) {
flag = false;
break;
}
cnt = 0;
ans++;
} else if (str[cur] == 'f') {
cnt++;
}
cur++;
if (cur >= len) cur -= len;
}
// cout << flag << endl;
printf("%d\n", flag ? ans : -1);
}
}
return 0;
}
G. Matches Puzzle Game
AC的C++语言程序:
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <queue>
#include <stack>
#include <algorithm>
#include <set>
#include <map>
#define lo(i, n, m) for (int i = n; i < m; i++)
#define loe(i, n, m) for (int i = n; i <= m; i++)
#define rlo(i, n, m) for (int i = n - 1; i >= m; i--)
#define rloe(i, n, m) for (int i = n; i >= m; i--)
#define pb push_back
#define mk make_pair
#define clr(a, b) memset((a), (b), sizeof(a))
typedef long long LL;
using namespace std;
// const int INF = 0x3f3f3f3f;
// const int INF = 0x7fffffff;
// const LL INF = 0x3f3f3f3f3f3f3f3f;
// const LL INF = 0x7fffffffffffffff;
const int NIL = -1;
template <class T>
inline T mx(T a, T b) {return a > b ? a : b;}
template <class T>
inline T mi(T a, T b) {return a < b ? a : b;}
template <class T>
inline void sw(T &a, T &b) {
T t = a; a = b; b = t;
}
template <class T>
inline T mabs(T x) {return x < 0 ? -x : x;}
inline char gc() {
char ret;
while ((ret = getchar()) == ' ' || ret == '\n' || ret == '\t');
return ret;
}
typedef unsigned int UI;
const int LIM = 510;
int mod;
int cost[] = {6, 2, 5, 5, 4, 5, 6, 3, 7, 6};
UI dp[LIM][2][2][2];
bool vis[LIM][2][2][2];
UI dfs(int r, int bv, int cv, int cr) {
if (r < 0) return 0;
if (r == 0 && (!cv || !bv)) return 0;
if (vis[r][bv][cv][cr]) return dp[r][bv][cv][cr];
UI &t = dp[r][bv][cv][cr];
t = 0;
if (bv && cv) {
if (!cr && !r) return t = 1;
else if (cr && r == 2) return t = 1;
return t = 0;
} else if (bv && !cv) {
loe(i, 0, 9) {
int sum = i + cr;
int dig = sum % 10;
if (i) t = (t + dfs(r - cost[dig] - cost[i], bv, 1, sum / 10)) % mod;
t = (t + dfs(r - cost[dig] - cost[i], bv, 0, sum / 10)) % mod;
}
} else if (!bv && cv) {
loe(i, 0, 9) {
int sum = i + cr;
int dig = sum % 10;
if (i) t = (t + dfs(r - cost[dig] - cost[i], 1, cv, sum / 10)) % mod;
t = (t + dfs(r - cost[dig] - cost[i], 0, cv, sum / 10)) % mod;
}
} else {
loe(i, 0, 9) loe(j, 0, 9) {
int sum = i + j + cr;
int dig = sum % 10;
if (i && j) t = (t + dfs(r - cost[dig] - cost[i] - cost[j], 1, 1, sum / 10)) % mod;
if (i) t = (t + dfs(r - cost[dig] - cost[i] - cost[j], 1, 0, sum / 10)) % mod;
if (j) t = (t + dfs(r - cost[dig] - cost[i] - cost[j], 0, 1, sum / 10)) % mod;
t = (t + dfs(r - cost[dig] - cost[i] - cost[j], 0, 0, sum / 10)) % mod;
}
}
vis[r][bv][cv][cr] = true;
return t;
}
int main() {
// ios::sync_with_stdio(false);
// cin.tie(NULL), cout.tie(NULL);
int t;
scanf("%d", &t);
loe(k, 1, t) {
clr(vis, false);
int n;
scanf("%d%u", &n, &mod);
printf("Case #%d: %u\n", k, dfs(n - 3, 0, 0, 0));
}
return 0;
}
//
H. Hold Your Hand
题解链接:
HDU 5457 Hold Your Hand【最小割+字典树】
HDU - 5457 Hold Your Hand (Trie + 最小割)
hdoj 5457 Hold Your Hand 【字典树 + 最小割】
树链剖:HDU 5458 Stability (2015 ACM/ICPC Asia Regional Shenyang Online)
Tarjan缩点+树剖+LCA+线段树:2015 ACM/ICPC Asia Regional Shenyang OnlineHDU-5458 Stability
J. Jesus Is Here
AC的C++语言程序:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<string>
#include<queue>
#include<map>
#include<set>
#include<list>
#include<ctime>
#include<ctype.h>
#include<stdlib.h>
#include<bitset>
#include<algorithm>
#include<numeric> //accumulate
#define endl "\n"
#define fi first
#define se second
#define FOR(i,s,t) for(int i=(s);i<=(t);++i)
#define mem(a,b) memset(a,b,sizeof(a))
#define rush() int T;scanf("%d",&T);while(T--)
using namespace std;
const int maxn=201314+5;
const int MOD=530600414;
int n;
long long ans[maxn];
long long len[maxn],cnt[maxn],sum[maxn];
int main()
{
//cin.tie(0);
//cout.tie(0);
//ios_base::sync_with_stdio(false);
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
len[3]=3,len[4]=5;
cnt[3]=cnt[4]=1;
sum[3]=1,sum[4]=3;
for(int i=5;i<=201314;i++)
{
len[i] = (len[i-1] + len[i-2])%MOD;
cnt[i] = (cnt[i-1] + cnt[i-2])%MOD;
sum[i] = (sum[i-1] + sum[i-2]+(len[i-2]*cnt[i-1])%MOD)%MOD;
ans[i] = (ans[i-1] + ans[i-2]+(((len[i-2]*cnt[i-2]-sum[i-2])%MOD)*cnt[i-1])%MOD+(sum[i-1]*cnt[i-2])%MOD)%MOD;
}
int cas=0;
rush()
{
cin>>n;
printf("Case #%d: %lld\n",++cas,(ans[n]+MOD)%MOD);
}
return 0;
}
/*
int read()
{
char c = getchar();
int x = 0;
for (; (c < 48 || c>57); c = getchar());
for (; c > 47 && c < 58; c = getchar())
{
x = (x << 1) + (x << 3) + c - 48;
}
return x;
}
*/
AC的C++语言程序:
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e6;
const int N = 201314;
typedef long long ll;
const ll mod = 530600414;
ll len[MAXN], cnt[MAXN], sumpre[MAXN], sumaft[MAXN], ans[MAXN];
int main() {
len[1] = 1; len[2] = 2;len[3] = 3,len[4] = 5;
//ans[3] = 1;
cnt[3] = 1,cnt[4] = 1;
sumpre[3] = 0;
sumaft[3] = 3;
ans[4] = 0;
for (int i = 4; i <= N;i++){
len[i] = len[i-1] + len[i-2]; len[i] =len[i] % mod;
cnt[i] = cnt[i-1] + cnt[i-2]; cnt[i] =cnt[i] % mod;
sumpre[i] = sumpre[i-2] % mod+ sumpre[i-1] % mod +(len[i-2] %mod * cnt[i-1] % mod)%mod;
sumpre[i] =sumpre[i] % mod;
sumaft[i] = sumaft[i-1] % mod + sumaft[i-2] % mod + (len[i-1] % mod *cnt[i-2] % mod) % mod;
sumaft[i] =sumaft[i] % mod;
ans[i] = sumpre[i-1] * cnt[i - 2] + sumaft[i-2] * cnt[i-1] + ans[i-1] + ans[i-2];
ans[i] = ans[i] % mod;
}
/* for (int i = 1; i < 10;i++){
cout << i << ": " << len[i] << " " << cnt[i] << " " << sumpre[i] << " " << sumaft[i] << " " << ans[i] << endl;
}*/
int T;
cin >> T;
for (int cas = 1; cas <= T; cas++){
int i;
cin >> i;
printf("Case #%d: %lld\n",cas, ans[i]);
//cout << ans[i] << endl;
}
return 0;
}
AC的C++语言程序:
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <queue>
#include <stack>
#include <algorithm>
#include <set>
#include <map>
#define lo(i, n, m) for (int i = n; i < m; i++)
#define loe(i, n, m) for (int i = n; i <= m; i++)
#define rlo(i, n, m) for (int i = n - 1; i >= m; i--)
#define rloe(i, n, m) for (int i = n; i >= m; i--)
#define pb push_back
#define mk make_pair
#define clr(a, b) memset((a), (b), sizeof(a))
typedef long long LL;
using namespace std;
// const int INF = 0x3f3f3f3f;
// const int INF = 0x7fffffff;
// const LL INF = 0x3f3f3f3f3f3f3f3f;
// const LL INF = 0x7fffffffffffffff;
const int NIL = -1;
template <class T>
inline T mx(T a, T b) {return a > b ? a : b;}
template <class T>
inline T mi(T a, T b) {return a < b ? a : b;}
template <class T>
inline void sw(T &a, T &b) {
T t = a; a = b; b = t;
}
template <class T>
inline T mabs(T x) {return x < 0 ? -x : x;}
inline char gc() {
char ret;
while ((ret = getchar()) == ' ' || ret == '\n' || ret == '\t');
return ret;
}
const int LIM = 201314 + 10;
const LL MOD = 530600414;
LL ans[LIM], pre[LIM], suf[LIM], cnt[LIM], len[LIM];
int main() {
// ios::sync_with_stdio(false);
// cin.tie(NULL), cout.tie(NULL);
// build
cnt[3] = 1, cnt[4] = 1;
pre[3] = 0, pre[4] = 2;
suf[3] = 3, suf[4] = 3;
len[3] = 3, len[4] = 5;
for (int i = 5; i < LIM; i++) {
ans[i] = (ans[i - 2] + ans[i - 1] + pre[i - 1] * cnt[i - 2] % MOD + suf[i - 2] * cnt[i - 1] % MOD) % MOD;
pre[i] = (pre[i - 1] + len[i - 2] * cnt[i - 1] % MOD + pre[i - 2]) % MOD;
suf[i] = (suf[i - 1] + len[i - 1] * cnt[i - 2] % MOD + suf[i - 2]) % MOD;
cnt[i] = (cnt[i - 1] + cnt[i - 2]) % MOD;
len[i] = (len[i - 1] + len[i - 2]) % MOD;
}
int t;
scanf("%d", &t);
loe(k, 1, t) {
int n;
scanf("%d", &n);
printf("Case #%d: ", k);
printf("%lld\n", ans[n]);
}
return 0;
}
K. Poker
题解链接:
hdu 5460 Poker(暴力)
2015沈阳网络赛K hdu5460(二进制枚举)
L. Largest Point
AC的C++语言程序:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<string>
#include<queue>
#include<map>
#include<set>
#include<list>
#include<ctime>
#include<ctype.h>
#include<stdlib.h>
#include<bitset>
#include<algorithm>
#include<numeric> //accumulate
#define endl "\n"
#define fi first
#define se second
#define FOR(i,s,t) for(int i=(s);i<=(t);++i)
#define mem(a,b) memset(a,b,sizeof(a))
#define rush() int T;scanf("%d",&T);while(T--)
using namespace std;
const int maxn=5000000+5;
int n;
int a,b;
int t[maxn];
vector<int> ans;
int main()
{
//cin.tie(0);
//cout.tie(0);
//ios_base::sync_with_stdio(false);
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int cas=0;
rush()
{
cin>>n>>a>>b;
ans.clear();
for(int i=0; i<n; i++)
{
scanf("%d",&t[i]);
}
sort(t,t+n);
ans.push_back(0),ans.push_back(n-1);
ans.push_back(1),ans.push_back(n-2);
int m1=0,m2=0;
for(int i=2; i<n-2; i++)
{
if(abs(t[i])<=abs(t[m1]))
{
m1=i;
}
else if(abs(t[i])<=abs(t[m2]))
{
m2=i;
}
}
ans.push_back(m1);
ans.push_back(m2);
sort(ans.begin(),ans.end());
ans.erase(unique(ans.begin(),ans.end()),ans.end());
int sz=ans.size();
long long mx=1ll*t[0]*t[0]*a+1ll*t[1]*b;
for(int i=0; i<1<<sz; i++)
{
int cnt=0;
int x1=-1,x2=-1;
for(int j=0; j<sz; j++)
{
if(i>>j&1)
cnt++;
}
if(cnt==2)
{
for(int j=0; j<sz; j++)
if(i>>j&1)
{
if(x1==-1)
x1=j;
else
x2=j;
}
mx=max(mx,1ll*t[ans[x1]]*t[ans[x1]]*a+1ll*t[ans[x2]]*b);
mx=max(mx,1ll*t[ans[x2]]*t[ans[x2]]*a+1ll*t[ans[x1]]*b);
}
}
printf("Case #%d: %lld\n",++cas,mx);
}
return 0;
}
/*
int read()
{
char c = getchar();
int x = 0;
for (; (c < 48 || c>57); c = getchar());
for (; c > 47 && c < 58; c = getchar())
{
x = (x << 1) + (x << 3) + c - 48;
}
return x;
}
*/
AC的C语言程序:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N = 5*1e6;
long long A[N + 10],B[N + 10],C[N + 10];
int main()
{
int T;
cin>>T;
for(int t = 1;t <= T;++t)
{
int n,a,b;
long long ans;
cin>>n>>a>>b;
for(int i = 0;i < n;++i)
{
scanf("%lld",&A[i]);
B[i] = a * A[i] * A[i];
C[i] = b * A[i];
}
sort(B,B + n);
sort(C,C + n);
if((!a||!b)||(B[n - 1]/a == C[n - 1]/b*C[n - 1]/b))
ans = max(B[n - 2] + C[n - 1],B[n - 1] + C[n - 2]);
else
ans = B[n - 1] + C[n - 1];
printf("Case #%d: %lld\n",t,ans);
}
return 0;
}
AC的C语言程序:
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <queue>
#include <stack>
#include <algorithm>
#include <set>
#include <map>
#define lo(i, n, m) for (int i = n; i < m; i++)
#define loe(i, n, m) for (int i = n; i <= m; i++)
#define rlo(i, n, m) for (int i = n - 1; i >= m; i--)
#define rloe(i, n, m) for (int i = n; i >= m; i--)
#define pb push_back
#define mk make_pair
#define clr(a, b) memset((a), (b), sizeof(a))
typedef long long LL;
using namespace std;
// const int INF = 0x3f3f3f3f;
// const int INF = 0x7fffffff;
// const LL INF = 0x3f3f3f3f3f3f3f3f;
// const LL INF = 0x7fffffffffffffff;
const int NIL = -1;
template <class T>
inline T mx(T a, T b) {return a > b ? a : b;}
template <class T>
inline T mi(T a, T b) {return a < b ? a : b;}
template <class T>
inline void sw(T &a, T &b) {
T t = a; a = b; b = t;
}
template <class T>
inline T mabs(T x) {return x < 0 ? -x : x;}
inline char gc() {
char ret;
while ((ret = getchar()) == ' ' || ret == '\n' || ret == '\t');
return ret;
}
struct Node {
int first, second;
};
const int LIM = 5e6 + 10;
Node l[LIM];
LL a, b;
inline bool cmp1(const Node &u, const Node &v) {
return a * u.first * u.first > a * v.first * v.first;
}
inline bool cmp2(const Node &u, const Node &v) {
return b * u.first > b * v.first;
}
inline LL sq(LL x) {return x * x;}
int main() {
// ios::sync_with_stdio(false);
// cin.tie(NULL), cout.tie(NULL);
int t, n;
scanf("%d", &t);
loe(k, 1, t) {
scanf("%d%lld%lld", &n, &a, &b);
lo(i, 0, n) scanf("%d", &l[i].first), l[i].second = i;
sort(l, l + n, cmp1);
int l1 = l[0].first, p1 = l[0].second, l2 = l[1].first;
sort(l, l + n, cmp2);
int r1 = l[0].first, p3 = l[0].second, r2 = l[1].first;
printf("Case #%d: ", k);
if (p1 != p3) printf("%lld", a * sq(l1) + b * r1);
else printf("%lld", mx(a * sq(l2) + b * r1, a * sq(l1) + b * r2));
putchar('\n');
}
return 0;
}