这场就做出一道题,怎么会有窝这么辣鸡的人呢?

1001 A Boring Question(hdu 5793)

很复杂的公式,打表找的规律,最后是m^0+m^1+...+m^n,题解直接是(m^(n+1)-1)/(m-1),长姿势,原来还能化简……

我既然不会推公式,也没啥好写的。写一下我打表的代码吧……

#include <cstdio>

typedef long long ll;

int n, m;
ll sum;
ll fac[];
int a[]; void init()
{
fac[] = ;
for (int i = ; i <= ; ++i) fac[i] = fac[i-] * i;
} void dfs(int p)
{
if (p == m) {
ll tmp = ;
for (int i = ; i < m-; ++i) {
tmp *= fac[ a[i+] ] / fac[ a[i] ] / fac[ a[i+]-a[i] ];
}
sum += tmp;
return ;
}
for (int i = a[p-]; i <= n; ++i) {
a[p] = i;
dfs(p+);
}
} int main(int argc, char const *argv[])
{
init(); for (int i = ; i <= ; ++i) {
for (int j = ; j <= ; ++j) {
sum = ;
n = i, m = j;
dfs();
printf("%-8lld", sum);
}
printf("\n");
} return ;
}

1002 A Simple Chess(hdu 5794)

一个棋盘,走棋的姿势要满足(x1-x2)^2+(y1-y2)^2==5,也就是以“日”字走,且只能向右下走。

其中有一些障碍不能经过,注意障碍有可能在终点,求从(1,1)走到(n,m)的路径数。

容斥+组合数 这题的简单版CF559C(对啊,我做过这题,我还是没做出来,wa了十多次,啦啦啦)

over是防止重点的,感觉不会有重点,但是比赛时是实在没辙了=_=#

这道题教育我,取模需谨慎!- -

#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
typedef long long ll;
const ll MOD = ;
const int MAX_P = ; ll powMod(ll a, ll b, ll mod)
{
ll res = ;
while (b) {
if (b & ) res = res * a % mod;
a = a * a % mod;
b >>= ;
}
return res;
} ll fac[MAX_P];
void getFact()
{
fac[] = ;
for (int i = ; i <= ; ++i)
fac[i] = fac[i - ] * i % MOD;
} ll Lucas(ll n, ll m, ll p)
{
ll res = ;
while (n && m) {
ll a = n % p;
ll b = m % p;
if (a < b) return ;
res = res * fac[a] % p * powMod(fac[b] * fac[a - b] % p, p - , p) % p;
n /= p;
m /= p;
}
return res;
} struct Point {
ll x, y;
Point(ll x, ll y):x(x),y(y){}
Point(){}
bool operator<(const Point a) const
{
if (x == a.x) return y < a.y;
return x < a.x;
}
bool operator==(const Point a) const
{
if (x == a.x && y == a.y) return true;
return false;
}
} p[]; ll cal(Point a, Point b)
{
ll dx = b.x - a.x;
ll dy = b.y - a.y;
ll r, c;
if ((dx*-dy)% || (dy*-dx)%) return ;
ll inv = powMod(, MOD-, MOD);
r = ( * dx - dy) / ;
c = ( * dy - dx) / ;
if (r < || c < ) return ;
if (c == || r == ) return ;
return Lucas(r+c, r, MOD);
} ll ans[];
bool over[];
int main()
{
//freopen("in", "r", stdin);
ll m, n, r;
getFact();
int cas = ;
while (cin >> m >> n >> r) {
printf("Case #%d: ", ++cas);
Point s(, );
for (int i = ; i < r; ++i) scanf("%lld%lld", &p[i].x, &p[i].y);
p[r].x = m, p[r].y = n;
sort(p, p + r);
if (p[r-].x == m && p[r-].y == n) {
printf("0\n");
continue;
}
memset(over, false, sizeof over);
for (int i = ; i < r; ++i) {
if (p[i] == p[i-]) over[i] = true;
}
for (int i = ; i <= r; ++i) {
if (over[i]) continue;
ans[i] = cal(s, p[i]);
for (int j = ; j < i; ++j) {
if (over[j]) continue;
if (p[j].x < p[i].x && p[j].y < p[i].y) {
ans[i] = ((ans[i] - cal(p[j], p[i]) * ans[j] % MOD) % MOD + MOD) % MOD;
}
}
}
ans[r] = (ans[r] + MOD) % MOD;
printf("%lld\n", ans[r]);
}
return ;
}

1003 A Simple Nim(hdu 5795)

nim博弈变形

有n堆糖,每次拿走一堆的任意个, 或者把一堆分成三堆。

对一堆求SG函数值,然后打表找规律,感觉不难,但是没想明白,后来有一个网友提醒我(额 虽然比赛时这样不太好……),终于开始写,其实一开始我是蒙蔽的,写写的突然清晰了,但是错了一个数……sg[2]应该是2,我竟然随手写成了0,妈蛋T^T

只能说掌握的不好0。0

#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std; #define PF(x) cout << "debug: " << x << " ";
#define EL cout << endl;
#define PC(x) puts(x); typedef long long ll; const int N = ;
const int MOD = 1e9+; int a[N];
int sg[N]; int get_sg(int x)
{
if (x == ) return ;
if (x == ) return ;
if (x == ) return ; if (sg[x] != -) return sg[x]; int mex[] = {}; for (int i = ; i < x; ++i) {
for (int j = i; j < x-i; ++j) {
int k = x - i - j;
if (k <= ) break;
int tmp = get_sg(i) ^ get_sg(j) ^ get_sg(k);
mex[tmp] = ;
}
} for (int i = ; i < x; ++i) {
mex[get_sg(i)] = ;
} for (int i = ; ; i++) {
if (!mex[i]) return sg[x] = i;
}
} int main(int argc, char const *argv[])
{
// memset(sg, -1, sizeof sg); // for (int i = 0; i < 100; ++i) {
// cout << i << " " << get_sg(i) << endl;
// } //freopen("in", "r", stdin);
int T;
scanf("%d", &T);
while (T--) {
int n;
scanf("%d", &n);
int ans = ;
for (int i = ; i < n; ++i) {
scanf("%d", a+i);
if (a[i] % == ) a[i]--;
else if (a[i] % == ) a[i]++;
ans ^= a[i];
}
printf("%s\n", ans ? "First player wins.":"Second player wins.");
}
return ;
}

1008 To My Girlfriend(hdu5800)

题意:f(i,j,k,l,m)表示n个物体,必须选择第i,j个,一定不选择第k,l个,且物品重量和为m的选择方法数。求 其中i,j,k,l各不相同。

题解:dp。

令dp[i][j][s1][s2]表示前i个物品填了j的体积,有s1个物品选为为必选,s2个物品选为必不选的方案数(0<=s1,s2<=2),则有转移方程dp[i][j][s1][s2] = dp[i - 1][j][s1][s2] + dp[i - 1][j - a[i]][s1 - 1][s2] + dp[i - 1][j][s1][s2 - 1],边界条件为dp[0][0][0][0] = 1,时间复杂度O(NS*3^2)。

dp[i][j][s1][s2] = dp[i - 1][j][s1][s2] + dp[i-1][j-a[i]][s1][s2] + dp[i - 1][j - a[i]][s1 - 1][s2] + dp[i - 1][j][s1][s2 - 1]

         ^不必选a[i] 不选          ^不必选 选a[i]                 ^ 必选a[i]                               ^必不选a[i]

dp开成long long会超内存,所以改成int ,注意不要爆,也可以改成滚动数组。

因为f(i,j,k,l,m)==f(j,i,k,l,m)==f(i,j,l,k,m)==f(j,i,l,k,m) 所以一个dp[n][s][2][2]是会被重复计算4次的,答案要*4.

#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll;
const int MOD = 1e9+;
const int N = ;
int a[N];
int dp[N][N][][]; void up(int &x, int y)
{
x += y;
if (x >= MOD) x -= MOD;
} int main(int argc, char const *argv[])
{
//freopen("in", "r", stdin);
int T;
scanf("%d", &T);
while (T--) {
int n, s;
scanf("%d%d", &n, &s);
for (int i = ; i <= n; ++i) scanf("%d", a+i);
memset(dp, , sizeof dp);
dp[][][][] = ;
for (int i = ; i <= n; ++i) {
for (int j = ; j <= s; ++j) {
for (int s1 = ; s1 <= ; ++s1) {
for (int s2 = ; s2 <= ; ++s2) {
int &now = dp[i][j][s1][s2];
up(now, dp[i-][j][s1][s2]); //非必选 不选
if (j >= a[i]) up(now, dp[i-][j-a[i]][s1][s2]); // 非必选 选
if (s1 > && j >= a[i]) up(now, dp[i-][j-a[i]][s1-][s2]); // 必选
if (s2 > ) up(now, dp[i-][j][s1][s2-]); // 必不选
}
}
}
}
int ans = ;
for (int j = ; j <= s; ++j) {
up(ans, dp[n][j][][]);
}
printf("%lld\n", (ll)ans * % MOD);
}
return ;
}

1010 Windows 10(hdu5802)

题意:(比赛时就没看懂题)音量上调是一秒提升1db,下降时,第一秒1db,连续下降每秒下降前一秒的一倍。求p~q需要几秒。

题解:感觉这题属于比较好想但是不易写代码的,如果p≤q,显然直接出结果,否则,先降到最接近q的位置,低于q就一秒一秒加上来,大于q就递归求解。

由于每两次递减需要停顿,所以可以把上升的次数放在递减之间,于是递归时需要记录有多少次按住的递减。

同时因为音量不能小于0,所以要特殊考虑一下。

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
typedef long long ll; ll pow2[];
ll p, q; void init()
{
pow2[] = ;
for (int i = ; i < ; ++i) pow2[i] = pow2[i-] * ;
for (int i = ; i < ; ++i) pow2[i] += pow2[i-];
} ll cal(ll p, ll ti)//ti是下压的次数 中间要停顿或者反向哦
{
if (p-q == ) return ti - ;
if (p-q == ) return ti + ; int pos = lower_bound(pow2, pow2+, p-q) - pow2;
ll g = pow2[pos];
ll s = pow2[pos-];
ll ans;
// g≥p-q
if (p-g < ) ans = max(ti, q) + pos;
else ans = max(ti, g-p+q) + pos;
// s<p-q
ans = min(ans, pos-+cal(p-s, ti+));
return ans;
} int main(int argc, char const *argv[])
{
//freopen("in", "r", stdin);
init();
int T;
cin >> T;
while (T--) {
scanf("%lld%lld", &p, &q);
if (p <= q) printf("%lld\n", q-p);
else printf("%lld\n", cal(p, ));
}
return ;
}

怎么会有窝这么弱的人呢?

2016多校第六场题解(hdu5793&hdu5794&hdu5795&hdu5800&hdu5802)的更多相关文章

  1. 2019牛客暑期多校第六场题解ABDJ

    A.Garbage Classification 传送门 题意:给你两个串,第一个串s由小写字母组成,第二个串t由dwh组成,长度为26,分别表示字母a到z代表的字符.现在要你判断: 如果字符串中‘h ...

  2. [题解]Shorten IPv6 Address-模拟(2019牛客多校第六场B题)

    题目链接:https://ac.nowcoder.com/acm/contest/886/B 题意: 您将获得一个IPv6地址,该地址是128位二进制字符串.请根据以下规则确定其最短的表示: 以十六进 ...

  3. 2019牛客多校第六场H Pair(数位DP 多个数相关)题解

    题意: 传送门 给你\(A,B,C\),要求你给出有多少对\((x, y)\)满足\(x\in [1,A],y\in [1,B]\),且满足以下任意一个条件:\(x \& y > C\) ...

  4. 牛客多校第六场G Is Today Friday?(吉姆拉尔森/蔡勒公式 + 思维)题解

    题意: 给你\(A-J\)的字母组成的日期,形式为\(yyyy/mm/dd\).现给你\(n\)个这样的串\((n<=1e5)\),问你把字母映射成数字,并且使得所有日期合法且为星期五的最小字典 ...

  5. 【HDU】4923 Room and Moor(2014多校第六场1003)

    Room and Moor Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) ...

  6. 2018牛客多校第六场 G.Pikachu

    题意: 给出一棵n个点的树,每条边有边权.对这个树加边变成一个完全图.新加的边的权值为边上两点在树上的距离.求完全图上任意两点的最大流之和. 题解: 一共有C(n,2)个点对.假设当前求s到t之间的最 ...

  7. 2018牛客多校第六场 I.Team Rocket

    题意: 给出n个区间和m个点(点按顺序给出且强制在线).每个区间只会被第一个他包含的点摧毁.问每个点能摧毁多少个区间以及每个区间是被哪个点摧毁的. 题解: 将n个区间按照左端点排序,然后用vector ...

  8. 牛客暑假多校第六场I-Team Rocket

    一.题意 我们是穿越银河的火箭队....... 给出若干个区间,之后给出若干个点,要求对每个点求出,第一个覆盖点的区间的数量,之后用当前所有点覆盖的区间的序号的乘积结合输入的Y来生成下一位点.最后输出 ...

  9. 牛客暑假多校第六场 I Team Rocket

    题意: 现在有n条火车, 每条火车都有一个运行 [ Li, Ri ], 现在有m支火箭队, 每次火箭队都会破坏这整条铁路上的一个点, 如果一条火车的运行区间[Li, Ri] 被破坏了, 那么这条火车会 ...

随机推荐

  1. 利用VS2005进行dump文件调试

    前言:利用drwtsn32或NTSD进行程序崩溃处理,都可以生成可用于调试的dmp格式文件.使用VS2005打开生成的DMP文件,能很方便的找出BUG所在位置.本文将讨论以下内容: 1.  程序编译选 ...

  2. POJ 3191 The Moronic Cowmpouter(进制转换)

    题目链接 题意 : 将一个10进制整数转化为-2进制的数. 思路 :如果你将-2进制下的123转化为十进制是1*(-2)^2+2*(-2)^1+3*(-2)^0.所以十进制转化为-2进制就是一个逆过程 ...

  3. 基于http.sys来开发的,真的是非常稳定

    真正的WEB服务器是不会用Indy写的.因为它是基于每连接每线程的. 其实真正的服务器需要下很多功夫,无法快速开发的.比如说,字符串处理.玩服务器基本上就是玩内存.举个例子: var str:Ansi ...

  4. Qt之显示网络图片(可以改成升级模块)

    http://blog.csdn.net/u011012932/article/details/50773382

  5. Android:属性scaleType与图片的显示

    ImageView是Android中的基础图片显示控件,该控件有个重要的属性是ScaleType,该属性用以表示显示图片的方式, 共有8种取值 matrix 用矩阵来绘制(从左上角起始的矩阵区域) f ...

  6. PHP开发搜索引擎技术全解析

    谈到网页搜索引擎时,很多人都会想到雅虎.的确,雅虎开创了一个互联网络的搜索时代.然而,雅虎目前用于搜索网页的技术却并非该公司原先自己开发的.2000年8月,雅虎采用了Google这家由斯坦福大学学生创 ...

  7. 使用net start mysql的时候出现服务名无效的原因及解决办法

    原因:mysql服务没有安装 解决办法:使用管理员权限,执行mysqld -install命令 然后以管理员身份net start mysql开启mysql服务 卸载mysql服务的方法 1.管理员权 ...

  8. poj 1125 Stockbroker Grapevine(最短路 简单 floyd)

    题目:http://poj.org/problem?id=1125 题意:给出一个社交网络,每个人有几个别人可以传播谣言,传播谣言需要时间.问要使得谣言传播的最快,应该从那个人开始传播谣言以及使得所有 ...

  9. poj3257

    dp,先将材料按以终点为关键字升序排 设f[i,j]为过山车到建到位置i在用了j元钱所得到的最大价值,然后 ..] of longint; f:..,..] of longint; l,n,k,m,j ...

  10. DTD约束文件

    在讲解DTD文件之前,我要说说一份合格的XML应该符合怎么样的规则? 就我总结一下几点,大家看看就好了: 1.一份XML有且仅有一个根元素. 2.XML是严格区分大小写的,<book>元素 ...