AtCoder Grand Contest 001 E - BBQ Hard

题目

这里写图片描述

分析

我们可以发现一个比较显然的结论:题目中要我们求的那个组合数就是 (ai,bi) (aj,bj) 的方案数,知道这个结论之后就可以比较显然的转移了。

设f[i][j]表示走到这个点的方案数,转移不难想到,最后要减去重复的状态

代码

#include <bits/stdc++.h>

using namespace std;  

#define ll long long
#define N 200005  
#define M 6005  
#define mod 1000000007  

int n;
int A[N],B[N];
int ans;

int dp[M][M];  

int jc[2 * M - 5], ny[2 * M - 5];  

int read()
{
    int x = 0, f = 1;
    char ch = getchar();
    while (ch < '0' || ch > '9') {if (ch == '-') f = -1; ch = getchar();}
    while (ch >= '0' && ch <= '9') {x = x * 10 + ch - '0'; ch = getchar();}
    return x * f;
}

void exgcd(int a,int b,int &x,int &y)  
{  
    if (!b)
    {
        x = 1;
        y = 0;
        return;
    }  
    exgcd(b, a % b, y, x);  
    y -= a / b * x;  
}  

int NY(int a,int m)  
{  
    int x, y;  
    exgcd(a, m, x, y);  
    return (x % m + m) % m;  
} 

int C(int m,int n)  
{  
    return 1ll * jc[m] * ny[n] % mod * ny[m - n] % mod;  
}  
int main()  
{  
    freopen("a.in","r",stdin);
    freopen("a.out","w",stdout);
    n = read();  
    jc[0] = jc[1] = ny[0] = ny[1] = 1;  
    for (int i = 2; i <= 12000; i++)  
    {  
        jc[i] = 1ll * jc[i - 1] * i % mod;  
        ny[i] = NY(jc[i], mod);  
    } 
    for (int i = 1; i <= n; i++)  
    {  
        A[i] = read(), B[i] = read();
        dp[-A[i] + 3000][-B[i] + 3000]++;  
    }  
    for (int i = 0; i <= 6000; i++)  
        for (int j = 0; j <= 6000; j++)  
        {  
            if(i)  
                dp[i][j] = (dp[i][j] + dp[i - 1][j]) % mod;  
            if(j)  
                dp[i][j] = (dp[i][j] + dp[i][j - 1]) % mod;  
        }  
    for (int i = 1; i <= n; i++)  
    {  
        ans = (ans + dp[A[i] + 3000][B[i] + 3000]) % mod;  
        ans = ((ans - C(A[i] + A[i] + B[i] + B[i], A[i] + A[i])) % mod + mod) % mod;  
    }  
    ans = 1ll * ans * ny[2] % mod;  
    printf("%d",ans);  
}
AtCoder Practice Contest #B - インタラクティブ練習 (Interactive Sorting) 是一道比较有趣的题目。它是一道交互式的排序题目,需要你与一个神秘程序进行交互,以便将一串无序的数字序列排序。 具体来说,这个神秘程序会给你一个长度为 $N$ 的数字序列,然后你需要通过询问它两个数字的大小关系,来逐步确定这个序列的排序顺序。每次询问之后,神秘程序都会告诉你两个数字的大小关系,比如第一个数字比第二个数字小,或者第二个数字比第一个数字小。你需要根据这个信息,来调整这个数字序列的顺序,然后再向神秘程序询问下一对数字的大小关系,以此类推,直到这个数字序列被完全排序为止。 在这个过程中,你需要注意以下几点: 1. 你最多只能向神秘程序询问 $Q$ 次。如果超过了这个次数,那么你的程序会被判定为错误。 2. 在每次询问之后,你需要及时更新数字序列的顺序。具体来说,如果神秘程序告诉你第 $i$ 个数字比第 $j$ 个数字小,那么你需要将这两个数字交换位置,以确保数字序列的顺序是正确的。如果你没有及时更新数字序列的顺序,那么你的程序也会被判定为错误。 3. 在询问的过程中,你需要注意避免重复询问。具体来说,如果你已经询问过第 $i$ 个数字和第 $j$ 个数字的大小关系了,那么你就不需要再次询问第 $j$ 个数字和第 $i$ 个数字的大小关系,因为它们的大小关系已经被确定了。 4. 在排序完成之后,你需要将排序结果按照从小到大的顺序输出。如果你输出的结果不正确,那么你的程序也会被判定为错误。 总的来说,这道题目需要你熟练掌握交互式程序设计的技巧,以及排序算法的实现方法。如果你能够熟练掌握这些技巧,那么就可以顺利地完成这道非传统题了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值