首页 > 其他分享 >6.26 模拟赛小记

6.26 模拟赛小记

时间:2023-06-27 22:56:02浏览次数:38  
标签:int ll times 6.26 ans 小记 公牛 模拟 mod

A.生成字符串 (syoj.1761) 洛谷 

P6191 [USACO09FEB] Bulls And Cows S

首先单独统计只有 0 - 1 个 1 的答案;

另所求序列由 "1000" 这样的形式再加一个 1 构成,设当前统计的有 i 个 1,此时序列长度 j 为 (k + 1) * (i - 1) + 1。如果所需序列长度已经超过限制便跳出。

否则计算$$C^i_{n-j+(i-1)+1}$$

意为把每一段中 "1000" 这样的整体及最后的一个 1 先删掉,此时序列中剩下的是散的 0。然后把删掉的整体中形如 "000" 这样的整段 0 看做一个新的整体,共有 (i - 1) 个,一一加回来。所以只用在整段 0 和散 0 中将 1 找空插入。(此时就不用考虑那个 0 究竟是散的还是整段了,因为整段个数和 1 的个数相互限制,0 一视同仁,空位一定是能正好放开 1 的。)

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int mod = 5000011;
int n, k;
ll ans = 1;
ll fac(ll x)
{
    ll tot = 1;
    for(int i = 2; i <= x; i ++ ) tot = tot * i % mod;
    return tot;
}
ll pmod(ll a, ll b)
{
    ll tot = 1;
    while(b)
    {
        if(b & 1) tot = (tot * a) % mod;
        a = (a * a) % mod;
        b >>= 1;
    }
    return tot;
}
ll C(ll x,ll y)
{
    if(x < y) return 0;
    return fac(x) * pmod(fac(y), mod - 2) % mod * pmod(fac(x - y), mod - 2) % mod;
}
int main()
{
    scanf("%d%d", &n, &k);
    ans += n;
    for(int i = 2; i <= n; i ++ )
    {
        int j = (k + 1) * (i - 1) + 1;
        if(j > n) break;
        if(j == n)
        {
            ans = (ans + 1 + mod) % mod;
            break;
        }
        else ans = (ans + C(n - j + (i - 1) + 1, i) + mod) % mod;
    }
    printf("%lld", ans % mod);
}
View Code

 


B.农夫与牛 (syoj.1762) 

P1641 [SCOI2010] 生成字符串

不难看出是前两天上课刚讲的洛谷 P1641 生成字符串

数形结合求出

$${{C_{n+m}^m - C_{n+m}^{n+1}}}$$/$${C_{n+m}^m} = {n-m+1}{n+1}$$

另外提醒涉及到计算小数的问题容易在精度上寄掉,因此最好把式子化到最简。

#include<bits/stdc++.h>
using namespace std;
int T, n, m;
int main()
{
    scanf("%d", &T);
    while(T -- )
    {
        scanf("%d%d", &n, &m);
        if(m > n) puts("0.000000");
        else printf("%.6lf\n", (double)(n + 1 - m) / (n + 1));
    }
    return 0;
}
View Code

 


C.农夫与牛 (syoj.1763) 

P3223 [HNOI2012] 排队

正难则反,补集转换。

先不考虑 Farmer John 和他的死对头 Farmer N 的限制算出答案,然后把 FJ 和 Farmer N 相邻的情况减掉。(这里我偷换了概念,应该是 Farmer John 和他的死对头 Farmer Nhoj,但。)

那么不考虑限制,两个农夫和他们可爱的奶牛就没有区别了。所有方案应是奶牛们的排列顺序 * 公牛排列顺序 * (一共有 n + 3 空)挑空把公牛放进去:

$${A_{n+2}^{n+2}} \times {A_m^m} \times {C_{n+3}^m}$$

两个死对头碰在一起那就坏事了,两个农夫就是一头奶牛!方案为俩农夫的顺序 * 奶牛们的排列顺序 * (共 n + 2 个空)挑空把公牛放进去:

$${{A_2^2} \times {A_{n+1}^{n+1}} \times {A_m^m} \times {C_{n+2}^m}}$$

作差。本题需要高精度所以不放码了(

 


D.农夫与牛 (syoj.1764)

P2592 [ZJOI2008] 生日聚会

发现数据范围很小,可以用 dp。

状态难定,多设几维。可以用 f[a][b][c][d] 来表示,当前选了 a 头公牛, b 头母牛。当前前缀中公牛最多比母牛多 c 头,母牛最多比公牛多 d 头。然后每次枚举状态看是否能转移,确定这个位置放公牛还是母牛并更新答案。注意加一或减一时都要和 0 比一下大小因为可能会出现全是公牛这样的情况。最后枚举符合条件的差统计答案。

显然 f[0][0][0][0] 这样的选择肯定存在一个方案。所以记得初始化。

#include<bits/stdc++.h>
using namespace std;
const int mod = 12345678;
int ans;
int n, m, k;
int f[155][155][25][25];
int main()
{
    scanf("%d%d%d", &n, &m, &k);
    f[0][0][0][0] = 1;
    for(int i = 0; i <= n; i ++ )
        for(int j = 0; j <= m; j ++ )
            for(int x = 0; x <= k; x ++ )
                for(int y = 0; y <= k; y ++ )
                    if(f[i][j][x][y])
                    {
                        int t = f[i][j][x][y];
                        f[i + 1][j][x + 1][max(y - 1, 0)] = (f[i + 1][j][x + 1][max(y - 1, 0)] + t) % mod;
                        f[i][j + 1][max(x - 1, 0)][y + 1] = (f[i][j + 1][max(x - 1, 0)][y + 1] + t) % mod; 
                    }
    for(int i = 0; i <= k; i ++ ) for(int j = 0; j <= k; j ++ ) ans = (ans + f[n][m][i][j]) % mod;
    printf("%lld", ans);
    return 0;
}
View Code

 


最近有点忙啊。

感觉一切都在 up up。

标签:int,ll,times,6.26,ans,小记,公牛,模拟,mod
From: https://www.cnblogs.com/Moyyer-suiy/p/17510124.html

相关文章

  • 【考后总结】6 月多校国赛模拟赛 6
    6.27冲刺国赛模拟25T1简单计数不是古典概型所以不能方案数相除。考虑枚举第一个选择的位置\(i\),这样分成两个独立的区间,只关心\(k\)所在的一个,转移方程:\[f_{n,k}=\dfrac{1}{n-1}\left([k<n]+[k>1]+\sum_{i>k}f_{i-1,k}+\sum_{i<k-1}f_{n-(i+1),k-(i+1)}\right)\]前缀和......
  • 【考后总结】6 月西安多校国赛模拟赛 3
    6.17冲刺国赛模拟20T1树染色容易发现每种方案都可以变成没有交边的链剖分,在此基础上的方案数是每个链顶的深度,考虑DP。直接DP大致是维护\(\prod(\proda+\prodb)\timesdep_{top}\),发现这个东西非常不好转移,转移时需要枚举叶子,复杂度不优秀。改为设\(f_{i,0/1}\)表......
  • 【考后总结】6 月西安多校国赛模拟赛 4
    6.21冲刺国赛模拟22T1跳跃不妨看作两只青蛙从相同起点出发且跳跃次数相同,设\(f_{i,j,k}\)为两只青蛙分别在\(i,j\)位置,且相差步数\(k\)。由于需要记录相邻位置对答案贡献,我们在要求必须严格按照升序对处理状态,也就是必须保证当前跳跃的一只青蛙落点在另一只青蛙更前面,且......
  • 【考后总结】6 月西安多校国赛模拟赛 5
    6.24冲刺国赛模拟24T2简单图论题原题:Gym-104053CCustomsControls2构造题。这个限制可以进一步加强到对于每个节点\(u\),\(1\tou\)的路径权值都相等,定义为\(d_u\)。于是对\(u\)连边的两个节点的\(d\)一定相等,进而可以把所有相等的缩到一起,且这些点直接不能连边(点......
  • C/C++全国交通咨询模拟系统[2023-06-27]
    C/C++全国交通咨询模拟系统[2023-06-27](1)提供对城市信息进行编辑(如:添加或删除)的功能。(2)城市之间有三种交通工具:汽车、火车或飞机,提供对全国城市交通图和汽车时刻表、列车时刻表及飞机航班表进行编辑的功能。(信息的输入方式可以是文件输入和键盘输入两种方式)。(3)提供两种最优决策......
  • 基于OpenMV的自动驾驶智能小车模拟系统
    一、项目简介基于机器视觉模块OpenMV采集车道、红绿灯、交通标志等模拟路况信息,实现一辆能车道保持、红绿灯识别、交通标志识别、安全避障以及远程WiFi控制的多功能无人驾驶小车。赛道规格:1、编程所需软件:OpenMV:使用OpenMV官方的OpenMVIDEESP8266:使用Arduino官方的ArduinoIDESTM3......
  • JS 模拟 循环队列
     LoopArray代码(基于JS原生数组)/***循环队列*/varALoopQueue=(function(){/***@type{Array}*/letarr;/***头节点*@type{number}*/letfrontIdx;/***尾节点*@type{number}*/......
  • 6.26会议纪要
    6.27会议纪要一、工作分配前端马冉冉:画用例图,确定用户,用户层级陈振辉:统计设备类型,数量后端郝子明、刘林涛:功能细化,统计系统的子系统、具体功能杨枭:流程梳理,统计系统涉及的流程薛贺程:技术选型,统计对比项目的设计模式、接口类型等二、文档书写注意事项文档先总写是做什......
  • 模拟HTTP测试post请求与get请求方式的工作原理与抓包分析
    一,工作原理与简介HTTP请求是客户端向服务器发送请求的过程,常见的HTTP请求方法有GET和POST。如下图,HTTP新建请求过程(1)GET请求的工作原理是,客户端向服务器发送一个请求,请求中包含要获取的资源路径和参数,服务器根据路径和参数返回相应的资源。GET请求可以在URL中传递参数,参数以键......
  • B0626 模拟赛题解
    原题链接前言重庆一位金牌大佬出的。感受:除了最后一题,感觉难度不如C组,甚至没之前D组题难?T1浪费2.5h,最后还是打表秒了。T2想出正解,但发现是数据结构题,最后40min怒打100行,差点打出正解。T3花20min打出20分部分分,赛后发现XD秒了(tql)。T4看题浪费5min......