BZOJ3907

BZOJ系列3907《网格》题解 Description 某城市的街道呈网格状,左下角坐标为A(0, 0),右上角坐标为B(n, m),其中n >= m。现在从A(0, 0)点出发,只能沿着街道向正右方或者正上方行走,且不能经过图示中直线左上方的点,即任何途径的点(x, y)都要满足x >= y,请问在这些前提下,到达B(n, m)有多少种走法。 Input 输入文件中仅有一行,包含两个整数n和m,表示城市街 阅读详情

题解是粘的 代码也是粘的

转自这里

(0,0)->(n,m)方案数为C(n,n+m), 然后减去不合法的方案. 作(n,m)关于y=x+1的对称点(m-1,n+1), 则(0,0)->(m-1,n+1)的任意一条路径都对应(0,0)->(n,m)的一条不合法路径(y>x). 所以答案就是C(n,n+m) - C(n+1,n+m).高精度算就OK了

#include<cstring>
#include<algorithm>

using namespace std;

const int maxn = 10009;
const int maxpn = 1500;

int N, M;
int p[maxpn], pn = 0;
int a[2][maxpn];
bool check[maxn];

void init() {
    scanf("%d%d", &N, &M);
    memset(check, 0, sizeof check);
    for(int i = 2, lim = N + M; i <= lim; i++) {
        if(!check[i]) p[pn++] = i;
        for(int j = 0; j < pn && i * p[j] <= lim; j++) {
            check[i * p[j]] = true;
            if(i % p[j] == 0) break;
        }
    }
    memset(a, 0, sizeof a);
    for(int i = N + 2; i <= N + M; i++)
        for(int j = 0, t = i; j < pn && t >= p[j]; j++)
            for(; t % p[j] == 0; a[0][j]++, a[1][j]++, t /= p[j]);
    for(int t = N + 1, j = 0; j < pn && t >= p[j]; j++)
        for(; t % p[j] == 0; a[0][j]++, t /= p[j]); 
    for(int i = 2; i < M; i++)
        for(int j = 0, t = i; j < pn && t >= p[j]; j++)
            for(; t % p[j] == 0; a[0][j]--, a[1][j]--, t /= p[j]);
    for(int t = M, j = 0; j < pn && t >= p[j]; j++)
        for(; t % p[j] == 0; a[0][j]--, t /= p[j]);
}

struct Int {
    static const int base = 10000;
    static const int maxn = 1000;
    static const int width = 4;
    int s[maxn], n;

    Int() : n(0) {
        memset(s, 0, sizeof s);
    }

    Int operator = (int num) {
        n = 0;
        for(; num; num /= base) s[n++] = num % base;
        return *this;
    }

    Int(int x) {
        *this = x;
    }

    Int operator = (const Int &o) {
        n = o.n;
        memcpy(s, o.s, sizeof(int) * n);
        return *this;
    }

    void write() {
        int buf[width];
        for(int i = n; i--; ) {
            int t = s[i], c = 0;
            for(; t; t /= 10) buf[c++] = t % 10;
            if(i + 1 != n)
                for(int j = width - c; j; j--) putchar('0');
            while(c--) putchar(buf[c] + '0');
        }
        puts("");
    }

    Int operator + (const Int &o) const {
        Int res;
        for(int i = 0, g = 0; ; i++) {
            if(!g && i >= o.n && i >= n) break;
            int x = g + (i < n ? s[n] : 0) + (i < o.n ? o.s[o.n] : 0);
            res.s[res.n++] += x / base;
            g = x % base;
        }
        return res;
    }

    Int operator += (const Int &o) {
        return (*this = *this + o);
    }

    Int operator * (const Int &o) const {
        Int ret; ret.n = o.n + n - 1;
        for(int i = 0; i < n; i++)
            for(int j = 0; j < o.n; j++) {
                int t = s[i] * o.s[j];
                ret.s[i + j] += t % base;
                ret.s[i + j + 1] += t / base;
            }
        for(int i = 0; i < ret.n; i++) if(ret.s[i] >= base) {
            ret.s[i + 1] += ret.s[i] / base;
            ret.s[i] %= base;
        }
        for(int &i = ret.n; ret.s[i]; i++) {
            ret.s[i + 1] += ret.s[i] / base;
            ret.s[i] %= base;
        }
        return ret;
    }

    Int operator *= (const Int &o) {
        return (*this = *this * o);
    }

    Int operator - (const Int &o) const {
        Int ret = *this;
        for(int i = ret.n; --i; ) {
            ret.s[i]--; ret.s[i - 1] += base;
        }
        for(int i = 0; i < o.n; i++)
            if((ret.s[i] -= o.s[i]) >= base)
                ret.s[i + 1]++, ret.s[i] -= base;
        if(!ret.s[n - 1]) ret.n--;
        return ret;
    }

};

Int power(int p, int a) {
    Int ret = 1, _p = p;
    for(; a; _p *= _p, a >>= 1) if(a & 1) ret *= _p;
    return ret;
}

int main() {

    init();
    Int ans = 1, t = 1;
    for(int i = 0; i < pn; i++)
        ans *= power(p[i], a[0][i]), t *= power(p[i], a[1][i]);
    (ans - t).write();

    return 0;
}
【BZOJ 3907】 网格 排列组合(卡特兰数)+python高精度~ 阅读详情

相关推荐

原形网络(Prototypical Networks)基于PyTorch的实现

我在Jay2coomzz的基础上修改了数据处理方式和evaluation_model()方法,作为初学者若有不当之处恳请大家批评指正,原文链接如下: https://blog.youkuaiyun.com/weixin_38471579/article/details/102631018 数据集和源码链接将放到评论区 文章目录1 数据集一个简单的数据集介绍数据集处理2 搭建网络CNNProtonets 1 数据集 一个简单的数据集介绍 Omniglot数据集一共包含1623 类手写体,每一类中包含20 个样本。其中.

weixin_43872532的博客 6636

【BZOJ】【3907】网格

组合数学/python 3907: 网格 Time Limit: 1 SecMemory Limit: 256 MBSubmit: 162Solved: 76[Submit][Status][Discuss] Description 某 城市的街道呈网格状,左下角坐标为A(0, 0),右上角坐标为B(n, m),其中n >= m。现在从A(0, 0)点出发,只能...

weixin_30263277的博客 277

佳能C3025打印机扫描方法

佳能C3025彩色打印机扫描方法 步骤一、如果打印机处于休眠状态,可按图中标记的按钮唤醒打印机; 然后点击屏幕上的【扫描】 步骤二、扫描类型选择【文件】 步骤三、点击屏幕上的【地址簿】 步骤四、此时屏幕胡看到名字,如果看不到自己的名字,可往下滑动直到看到自己的名字,然后点击自己的名字,再点击右下角的【应用】 步骤五、点击【发送设置】,可看到文件格式为PDF,点击可以选择JPEG的图片格式。...

weixin_46019317的博客 2万+

Bzoj 3907: 网格

Bzoj 3907: 网格 推一下$C_{2n}^n-C_{2n}^{n-1}$这个公式。 当n=m时 ,从黑格子左下角到右上角的方案数(不保证合法)为$C_{2n}^{n}$,相当于有2n个位置,其中选出n个向右,另外n个向上。 然后看不合法的方案。不合法则肯定经过了黄线,从第一次到达黄线开始,以后的路径沿黄线反转,那么不合法的方案数就是从黑格子左下角到蓝格子右上角的方案数 $C_{2n...

weixin_30763397的博客 239

别再手动调参了!用Optuna+PyTorch搞定Transformer时序预测超参数(附完整代码)

本文详细介绍了如何利用Optuna和PyTorch实现Transformer时序预测模型的自动化超参数调优。通过贝叶斯优化技术,显著提升单变量时序预测的效率和准确性,并附有完整代码实现。文章涵盖模型架构设计、数据预处理、Optuna调参实战及生产环境部署建议,为开发者提供一站式解决方案。

weixin_33704234的博客 576

《UE4游戏开发》之 《音效系统的实现》

音效系统需要负责管理什么事情: 1.1 确定声音控制的分类:如背景音乐、技能音效、界面音效、角色配音等,不同游戏对声音有不同的分类 1.2 控制每个分类的声音的开启与关闭,以及调节每个分类声音的大小 解决如何分类: 2.1 首先需要知道ue4为声音分类提供了什么:SoundClass通常需要一个根分类【SC_RPG_Master】,便于总体控制音效,以及指定引擎默认启动的音效 打开SoundClass资产【SC_RPG_Master】,对根控制的设置,将逐级传递并按比例进行设置,以此达到控制一类声音的目的.

qq_21919621的博客 2126

[BZOJ3907]网格(卡特兰数+组合数学+高精度)

题目描述传送门题解这道题和买票找零问题是差不多一样的 计算的时候需要高精度 分解质因数之后只需要一个高精乘单精和一个高精减就可以了代码#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<cmath> using namespace std; #define N 10000int n,

zyf2000 958

PADS VX2.7学习记录06-PADS Router软件功能操作

PADS VX2.7学习记录06-PADS Router软件功能操作

qq_31444421的博客 7860

【BZOJ3907】网格 组合数,补集转换

题解:      ~~~~~ 首先从 (0,0)(0,0) 到 (n,m)(n,m) 是右走 nn 步, 上走 mm 步。方案数是在 nn 个数中 n+1n+1 个空中插 mm 个数,组合数是Cmn+mC_{n+m}^m。      ~~~~~ 然后从中减去穿过 y=xy = x 这条线的那些方案数就好了。      ~~~~~ 但是这个很难求,而若要求 [ 不经过 ] 则就可以有特别的技

辗转山河弋流歌 2265

DDR4 硬件设计笔记

DDR4-DRAM是第四代支持双倍数据读取,支持随机位置存取的静态存储器。DDR4-DRAM的工作原理。DDR之T拓扑和Fly-by拓扑。DDR的硬件设计。DDR4 PCB设计要点介绍。DDR4之PCB走线间距的串扰评估。DDR4之内存通道(channel)和内存列(rank)。

qq_26815321的博客 1万+

ZYNQ系列PS侧和PL侧DDR3或DDR4在AD(Altium Designer 25)中的layout布线规则约束

DDR3或DDR4的PCB布线规则通常有相对固定的要求,对应的,在PCB设计时有固定的约束设置。

FPGA艺术家的博客 787

BZOJ3907 网格

题目:BZOJ3907: 网格 思路: 显然,这道题是卡特兰数经典模型的变式。 假设不考虑越界限制,从(0,0)到(n,m)的总方案数为\(C_{n+m}^n\),如果能计算出其中有哪些是不合法的,二者相减即可。 我们可以用一个1和-1的串记录行走的路径,记向右走为+1,向上走为-1,则一条合法路径满足串中任意位置的前缀和均不小于0。串长为n+m,其中有n个1,m个-1,所以串的总数有\...

denge2160的博客 314

基于深度学习DNN LSTM网络的光伏发电量预测 完整代码数据 可直接运行

基于深度学习DNN LSTM网络的光伏发电量预测 完整代码数据 可直接运行

2079

bzoj3907 网格 & bzoj2822 [AHOI2012]树屋阶梯——卡特兰数+高精度

题目:bzoj3907:https://www.lydsy.com/JudgeOnline/problem.php?id=3907 bzoj2822:https://www.lydsy.com/JudgeOnline/problem.php?id=2822 bzoj3907: 从网格图的角度很好想啊,就是像定义一样,一下子就出来了 ans = C(n+m,n) - C(n+m...

aodan5477的博客 105

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

bzoj3907: 网格

链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3907 题意:中文题。。。 分析:用卡特兰数的非常规法证明F[n]=C(2*n,n)-C(2*n,n-1)那种方法可以分析出这题的答案为C(n+m,n)-C(n+m,n+1),详见百度百科,再用高精度处理一下即可。 代码: #include #include #include #include #inc

Fsss 1524

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

bzoj3907 网格

给你一个n * m的网格,你要从(0,0)走到(n,m)并且走的时候不越过y = x这条直线,求有多少种不同的走法 嗯...要高精度 python (感谢会考 fac = {} def C(n,m): return fac[n] / (fac[m] * fac[n-m]) fac[0] = 1 for i in range(1,10000): f...

aobai7842的博客 149

BZOJ3907网格

这东西是拿Cat思想搞得组合数学。 首先做这个需要会用网格法或折线法分析Cat的$C_{2n}^n-C_{2n}^{n-1}$是怎么来的。 网格法:假如没有限制,从(0,0)到(n,n)的方案数为$C_{2n}^n$,就是一共有2n次操作位置(向右或向上),我们把向上走的操作插入这些位置即得上式,上面的黄线是当我们走到不合法情况时所碰到的第一条线,然后最终我们会走到(n,n)这个...

weixin_30538029的博客 199

BZOJ 3907: 网格

Description 求不跨过直线 \(y=x\) ,到达 \((n,m)\) 的方案数. Sol 组合数学+高精度. 这个推导过程跟 \(Catalan\) 数是一样的. 答案就是 \(C^{n+m}_n-C^{n+m}_{n+1}\) 自己随便化简一下就是 \(\frac {(n+m)!(n-m+1)} {(n+1)!m!}\) . 然后需要先分解下质因数,再用高精度....

aisen1985的博客 242

网格 [Bzoj 3907]

网格

Leo的博客 875

【BZOJ 3907】【JZOJ 3431】网格

Description某城市的街道呈网格状,左下角坐标为A(0, 0),右上角坐标为B(n, m),其中n >= m。现在从A(0, 0)点出发,只能沿着街道向正右方或者正上方行走,且不能经过图示中直线左上方的点,即任何途径的点(x, y)都要满足x >= y,请问在这些前提下,到达B(n, m)有多少种走法。 Solution之前做过一道几乎一样的题;首先不考虑中间那条y=x的线,答案很显然就是

846

[BZOJ 3907] [JZOJ 3431] 网格

Description 某城市的街道呈网格状,左下角坐标为A(0, 0),右上角坐标为B(n, m),其中n >= m。现在从A(0, 0)点出发,只能沿着街道向正右方或者正上方行走,且不能经过图示中直线左上方的点,即任何途径的点(x, y)都要满足x >= y,请问在这些前提下,到达B(n, m)有多少种走法。 100%的数据中,1 <= m <= n <= 5 000Analysis因为我是蒟蒻

LYD729 1031
上一篇: BZOJ2396 随机化
下一篇: BZOJ1746 DP
Devil_Gary
博客等级 码龄9年 5粉丝 56原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值