2016多校第六场1001-1003(hdu5793&hdu5794&hdu5795)

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

1001

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

1002

一个棋盘,走棋的姿势要满足(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 = 110119;
const int MAX_P = 2000005;

ll powMod(ll a, ll b, ll mod)
{
    ll res = 1;
    while (b) {
        if (b & 1) res = res * a % mod;
        a = a * a % mod;
        b >>= 1;
    }
    return res;
}

ll fac[MAX_P];
void getFact()
{
    fac[0] = 1;
    for (int i = 1; i <= 2000000; ++i)
        fac[i] = fac[i - 1] * i % MOD;
}

ll Lucas(ll n, ll m, ll p)
{
    ll res = 1;
    while (n && m) {
        ll a = n % p;
        ll b = m % p;
        if (a < b) return 0;
        res = res * fac[a] % p * powMod(fac[b] * fac[a - b] % p, p - 2, 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[2005];

ll cal(Point a, Point b)
{
	ll dx = b.x - a.x;
	ll dy = b.y - a.y;
	ll r, c;
	if ((dx*2-dy)%3 || (dy*2-dx)%3) return 0;
	ll inv = powMod(3, MOD-2, MOD);
	r = (2 * dx - dy) / 3;
	c = (2 * dy - dx) / 3;
	if (r < 0 || c < 0) return 0;
	if (c == 0 || r == 0) return 1;
	return Lucas(r+c, r, MOD);
}

ll ans[2005];
bool over[2005];
int main()
{
    //freopen("in", "r", stdin);
    ll m, n, r;
    getFact();
    int cas = 0;
    while (cin >> m >> n >> r) {
    	printf("Case #%d: ", ++cas);
        Point s(1, 1);
        for (int i = 0; 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-1].x == m && p[r-1].y == n) {
        	printf("0\n");
        	continue;
        }
        memset(over, false, sizeof over);
        for (int i = 1; i < r; ++i) {
        	if (p[i] == p[i-1]) over[i] = true;
        }
        for (int i = 0; i <= r; ++i) {
            if (over[i]) continue;
            ans[i] = cal(s, p[i]);
            for (int j = 0; 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 0;
}

  

1003

nim博弈变形

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

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

#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 = 1000005;
const int MOD = 1e9+7;

int a[N];
int sg[N];

int get_sg(int x)
{
    if (x == 0) return 0;
    if (x == 1) return 1;
    if (x == 2) return 2;

    if (sg[x] != -1) return sg[x];

    int mex[200000] = {0};

    for (int i = 1; i < x; ++i) {
        for (int j = i; j < x-i; ++j) {
            int k = x - i - j;
            if (k <= 0) break;
            int tmp = get_sg(i) ^ get_sg(j) ^ get_sg(k);
            mex[tmp] = 1;
        }
    }

    for (int i = 0; i < x; ++i) {
        mex[get_sg(i)] = 1;
    }

    for (int i = 0; ; 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 = 0;
        for (int i = 0; i < n; ++i) {
            scanf("%d", a+i);
            if (a[i] % 8 == 0) a[i]--;
            else if (a[i] % 8 == 7) a[i]++;
            ans ^= a[i];
        }
        printf("%s\n", ans ? "First player wins.":"Second player wins.");
    }
    return 0;
}

  

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

时间: 2024-12-16 06:18:06

2016多校第六场1001-1003(hdu5793&hdu5794&hdu5795)的相关文章

HDU 5794 A Simple Nim 2016多校第六场1003

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5795 题意:给你n堆石子,每一堆有ai石头,每次有两种操作,第一种在任意一堆取出任意数量的石头但不能为0,第二种把一堆石头分成三堆任意数量的石头(不能为0),问是先手赢还是后手赢. 题解:这就是一个Nim游戏!那么Nim游戏一般跟SG函数有关,所以这道题打表找规律即可. 关于SG函数,在这里也说一下吧!毕竟第一次接触. Nim游戏与SG函数:http://baike.baidu.com/link?u

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

Room and Moor Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 263    Accepted Submission(s): 73 Problem Description PM Room defines a sequence A = {A1, A2,..., AN}, each of which is either 0

hdu5353||2015多校联合第六场1001 贪心

http://acm.hdu.edu.cn/showproblem.php?pid=5353 Problem Description There are n soda sitting around a round table. soda are numbered from 1 to n and i-th soda is adjacent to (i+1)-th soda, 1-st soda is adjacent to n-th soda. Each soda has some candies

2014 HDU多校弟六场J题 【模拟斗地主】

这是一道5Y的题目 有坑的地方我已在代码中注释好了 QAQ Ps:模拟题还是练的太少了,速度不够快诶 //#pragma comment(linker, "/STACK:16777216") //for c++ Compiler #include <stdio.h> #include <iostream> #include <climits> #include <cstring> #include <cmath> #inclu

多校第六场 HDU 4927 JAVA大数类

题目大意:给定一个长度为n的序列a,每次生成一个新的序列,长度为n-1,新序列b中bi=ai+1?ai,直到序列长度为1.输出最后的数. 思路:这题实在是太晕了,比赛的时候搞了四个小时,从T到WA,唉--对算组合还是不太了解啊,现在对组合算比较什么了-- import java.io.*; import java.math.*; import java.util.*; public class Main { public static void main(String[] args) { Sca

HDU 4923 Room and Moor (多校第六场C题) 单调栈

Problem Description PM Room defines a sequence A = {A1, A2,..., AN}, each of which is either 0 or 1. In order to beat him, programmer Moor has to construct another sequence B = {B1, B2,... , BN} of the same length, which satisfies that: Input The inp

hdu 5288||2015多校联合第一场1001题

http://acm.hdu.edu.cn/showproblem.php?pid=5288 Problem Description OO has got a array A of size n ,defined a function f(l,r) represent the number of i (l<=i<=r) , that there's no j(l<=j<=r,j<>i) satisfy ai mod aj=0,now OO want to know ∑i

2014多校第六场 1005 || HDU 4925 Apple Tree

题目链接 题意 : 给你一块n×m的矩阵,每一个格子可以施肥或者是种苹果,种一颗苹果可以得到一个苹果,但是如果你在一个格子上施了肥,那么所有与该格子相邻(指上下左右)的有苹果树的地方最后得到的苹果是两倍,如果(i,j)有一颗苹果树,(i-1,j)与(i,j+1)施了肥,那么苹果应该是1的两倍2,2的两倍4,最后是4个苹果,问你怎么安排苹果和施肥的格子使最后得到的苹果最多. 思路 : 画了图就可以看出来,苹果和苹果,肥与肥之间不要相邻就好了,所有的苹果之间都有施肥,所有施肥的格子都被苹果隔开了才能

2014多校第五场1001 || HDU 4911 Inversion (归并求逆序数)

题目链接 题意 : 给你一个数列,可以随意交换两相邻元素,交换次数不超过k次,让你找出i < j 且ai > aj的(i,j)的对数最小是多少对. 思路 : 一开始想的很多,各种都想了,后来终于想出来这根本就是求逆序数嘛,可以用归并排序,也可以用树状数组,不过我们用树状数组做错了,也不知道为什么.求出逆序数来再减掉k次,就可以求出最终结果来了.求逆序数链接1,链接2 1 #include <stdio.h> 2 3 int left[250003], right[250003];