BestCoder Round #40 A B C

A,水题,直接枚举到sqrt

B,每次对于每一位枚举,如果小于当前位,那么答案可以计算出来,增加得答案为:设3个部分,前完全一样的部分a,中间新选的一个b,后面的全排列c,这样就把每部分和每两部分能够组成的逆序对个数计算出来,由于n只有100,里面在去枚举也是没问题的,主要是后面全排列c的逆序对数,这个可以利用dp处理出来,dp[i] = dp[i - 1] * i + i! * sum(i - 1),sum(i)表示1到i的和。

C:推公式,C(n, m) = C(n - 1, m - 1) + C(n - 1, m) = C(n - 1, m - 1) + C(n - 2, m - 1) + C(n - 2, m)....这样对于C(i, k),a <= i <= b的和,就等于是C(b + 1, k + 1) - C(a, k + 1),然后由于p比较小,要用lucas计算组合数即可

代码:

A:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

int t, n;

int main() {
    scanf("%d", &t);
    while (t--) {
        scanf("%d", &n);
        int ans = 2000000000LL;
        for (int i = 1; i * i <= n; i++) {
            if (n % i == 0) {
                ans = min(ans, (n / i + i) * 2);
            }
        }
        printf("%d\n", ans);
    }
    return 0;
}

B:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

typedef long long ll;
const int N = 105;
const int MOD = 1000000007;

int n, a[N], vis[N], dp[N], fac[N], sum[N];

int tot;

int dfs(int u) {
    if (u == n) return 0;
    int ans = 0;
    int cnt = 0;
    for (int i = 1; i < a[u]; i++) {
        if (vis[i]) continue;
        ans = (ans + (ll)tot * fac[n - u - 1] % MOD) % MOD;
        if (n - u - 1 > 0) ans = (ans + (ll)cnt * (n - u - 1) % MOD * fac[n - u - 2] % MOD) % MOD;
        ans = (ans + dp[n - u - 1]) % MOD;
        int tmp = 0;
        for (int j = u - 1; j >= 0; j--) {
            if (a[j] > i) tmp++;
        }
        int sb = 0;
        int sbb = 0;
        for (int j = 1; j <= n; j++) {
            if (j == i) continue;
            if (vis[j]) sbb += sb;
            else sb++;
        }
        if (n - u - 1 > 0) ans = (ans + (ll)sbb * (n - u - 1) % MOD * fac[n - u - 2] % MOD) % MOD;
        ans = (ans + (ll)tmp * fac[n - u - 1] % MOD) % MOD;
        cnt++;
    }
    vis[a[u]] = 1;
    for (int i = a[u] + 1; i <= n; i++) if (vis[i]) tot++;
    ans = (ans + dfs(u + 1)) % MOD;
    return ans;
}

int main() {
    fac[0] = 1;
    for (int i = 1; i < N; i++) {
        fac[i] = (ll)fac[i - 1] * i % MOD;
        sum[i] = (sum[i - 1] + i) % MOD;
    }
    for (int i = 2; i < N; i++)
        dp[i] = ((ll)dp[i - 1] * i % MOD + (ll)fac[i - 1] * sum[i - 1] % MOD) % MOD;
    while (~scanf("%d", &n)) {
        for (int i = 0; i < n; i++) scanf("%d", &a[i]);
        memset(vis, 0, sizeof(vis));
        tot = 0;
        printf("%d\n", dfs(0));
    }
    return 0;
}

C:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

const int N = 100005;
typedef long long ll;

int f[N], f2[N];
int x1, x2, y1, y2, p;

int pow_mod(int x, int k) {
    int ans = 1;
    while (k) {
        if (k&1) ans = (ll)ans * x % p;
        x = (ll)x * x % p;
        k >>= 1;
    }
    return ans;
}

int C(int n, int m) {
    if (m > n || n < 0 || m < 0) return 0;
    return (ll)f[n] * f2[m] % p * f2[n - m] % p;
}

int lucas(int n, int m) {
    if (m == 0) return 1;
    return (ll)C(n % p, m % p) * lucas(n / p, m / p) % p;
}

int main(){
    while (~scanf("%d%d%d%d%d", &x1, &y1, &x2, &y2, &p)) {
        f[0] = 1;
        for (int i = 1; i < min(N, p); i++)
            f[i] = (ll)f[i - 1] * i % p;
        f2[min(N, p) - 1] = pow_mod(f[min(N, p) - 1], p - 2);
        for (int i = min(N, p) - 2; i >= 0; i--)
            f2[i] = (ll)f2[i + 1] * (i + 1) % p;
        int ans = 0;
        for (int i = y1; i <= y2; i++) ans = (ans + ((lucas(x2 + 1, i + 1) - lucas(x1, i + 1)) % p + p) % p) % p;
        printf("%d\n", ans);
    }
     return 0;
}
时间: 2024-11-11 02:41:57

BestCoder Round #40 A B C的相关文章

HDU 5224 Tom and paper(BestCoder Round #40)

题目链接:Tom and paper 题面: Tom and paper Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 679    Accepted Submission(s): 432 Problem Description There is a piece of paper in front of Tom, its length

BestCoder Round #40

弱渣做不动CF了,弱渣只能水水BC了,于是就开始每周开心地BC了,顺便写个水水的题解~~ 题A hdu 5224 题意:略 题解:枚举边长即可. 1 /*zhen hao*/ 2 #include <bits/stdc++.h> 3 using namespace std; 4 5 #define lson l, m, rt*2 6 #define rson m + 1, r, rt*2+1 7 #define xx first 8 #define yy second 9 10 typedef

BestCoder Round #40 解题报告

这场是第一场没有米的BC... 大概也是想震一震那些一听说没米了就不打BC的人吧 这次的题目质量比以往高了许多 (然而我并没有打这一场BC 但是今天下午到现在做的过程中真的学到了不少知识呢 A题略水... 1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<cmath> 5 int T,n; 6 int main(){ 7 scanf("%d",&am

BestCoder Round #40 1001——精度——Tom and paper

Problem Description There is a piece of paper in front of Tom, its length and width are integer. Tom knows the area of this paper, he wants to know the minimum perimeter of this paper. Input In the first line, there is an integer T indicates the numb

HDU5226 Tom and matrix(BestCoder Round #40)

Tom and matrix Accepts: 29 Submissions: 225 Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) 问题描述 Tom放学回家的路上,看到天空中出现一个矩阵.Tom发现,如果矩阵的行.列从0开始标号,第i行第j列的数记为ai,j,那么ai,j=Cji 如果i < j,那么ai,j=0 Tom突发奇想,想求一个矩形范围内所有数的和.Tom急着回家,当然

HDU5224 Tom and paper(BestCoder Round #40)

Tom and paper Accepts: 464 Submissions: 955 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) 问题描述 Tom面前有一张纸,它的长和宽都是整数.Tom知道这张纸的面积n,他想知道这张纸的周长最小是多少. 输入描述 有多组数据.第一行一个正整数T,表示数据组数.接下来T行,每行一个正整数n,表示纸的面积. T≤10,n≤109 输出描述 对于每

hdu5225 Tom and permutation(BestCoder Round #40)

Tom and permutation Accepts: 120 Submissions: 422 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) 问题描述 Tom学会了通过写程序求出一个1-n的排列的逆序对数,但他的老师给了他一个难题: 给出一个1-n的排列,求所有字典序比它小的1-n的排列的逆序对数之和. Tom一时不知道该怎么做,所以他来找你帮他解决这个问题. 因为数可能很大,

BestCoder Round #16

BestCoder Round #16 题目链接 这场挫掉了,3挂2,都是很sb的错误 23333 QAQ A:每个数字,左边个数乘上右边个数,就是可以组成的区间个数,然后乘的过程注意取模不然会爆掉 B:dp,dp[i][2]记录下第一长的LIS,和第二长的LIS,哎,转移的时候一个地方写挫掉了导致悲剧啊QAQ C:首先如果知道Nim游戏的,就很容易转化问题为,一些数字是否能选几个能否异或和为0,那么就是每个数字拆成40位,然后每一位异或和为0,这样就可以构造出40个方程,然后高斯消元求解,如果

BestCoder Round #4 前两题 hdu 4931 4932

第一题太水了.. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 int a[6]; 7 int main(){ 8 int cas; 9 scanf( "%d", &cas ); 10 while( cas-- ){ 11 for( int i = 0; i <