这题说的给了一个整数n 和一串的括号, 那么要我们计算 最后有n/2对括号的 方案数有多少。

我们可以先预先判断一些不可能组成正确括号对的情况,

然后我们可以将这个问题转化到二维平面上, 令 m = n/2  ,L 为左括号的个数 R为右括号的个数  可以知道还有 m - L 个左括号没用, 有m-R个右括号没用,令他们分别我p=m-R,q=m-L, 然后机的就是 (0,0)点到 (p,q)点 不跨过x=y这条线的方案数,那么我们可以这样做,将 (0,0) 向下移动 1 个单位,(0,-1)-》》》》》(p,q-1) , 假设如果非法那么必须会经过(d,d)这个点,我们知道从(0,-1)到(d,d)和(-1,0)到(d,d)的方案数是一样的,那么我们就知道了从(0,1) 出发的非法的方案数为 (-1,0) 到(p.q-1) 的方案数,那么最终的答案就是 C(p+q,q)-C(p+q,q-1);

 #include <iostream>
#include <cstdio>
#include <algorithm>
#include <string.h>
#include <vector>
using namespace std;
const int maxn = +;
typedef long long LL;
const LL mod = ;
LL dp[maxn];
LL mdp[maxn];
LL vdp[maxn];
char str[maxn];
void gcd(LL a, LL b, LL &d, LL &x, LL &y){
if(!b) {d=a; x= ; y =;}
else{gcd(b,a%b,d,y,x); y -= x*(a/b);}
}
LL inv(LL a, LL n){
LL d,x,y;
gcd(a,n,d,x,y);
return d== ? (x+n)%n:-;
}
int main()
{
dp[]=;
for(LL i=; i<=; ++i){
dp[i]=(dp[i-]* i)%mod;
}
int n;
while(scanf("%d",&n)==){
scanf("%s",str); if(n%){
printf("0\n"); continue;
}
LL m = n/;
int len =strlen(str);
LL L=,R=;
for(int i=; i<len; ++i){
if(str[i]=='(') L++;
else if(str[i]==')')R++;
if(L<R){
L=-; break;
}
}
if(L==-||L>m){
printf("0\n");continue;
}
if(L==R&&L+R==n){
printf("1\n");continue;
}
L=m - L;
R=m - R;
LL d0 = L;
L=R; R=d0;
LL d1 = inv(L+,mod); LL d2 = inv(dp[L],mod);
LL d3 = inv(dp[R],mod); LL ans =( ( ( ( ( ( ( ( L-R+ )*d1 )%mod) * d2 )%mod) * d3)%mod) * dp[L+R])%mod;
printf("%I64d\n",ans);
} return ;
}

hdu5184 数论证明的更多相关文章

  1. Codeforces Round #586 (Div. 1 + Div. 2)D(二分图构建,思维,结论需数论证明)

    #include<bits/stdc++.h>using namespace std;long long a[200007];vector<int>v[77];int main ...

  2. noip做题记录+挑战一句话题解?

    因为灵巧实在太弱辽不得不做点noip续下命QQAQQQ 2018 积木大赛/铺设道路 傻逼原题? 然后傻逼的我居然检查了半天是不是有陷阱最后花了差不多一个小时才做掉我做过的原题...真的傻逼了我:( ...

  3. 幸运的袋子(深度优先遍历(Depth First Search,DFS))

    题目描述 一个袋子里面有n个球,每个球上面都有一个号码(拥有相同号码的球是无区别的).如果一个袋子是幸运的当且仅当所有球的号码的和大于所有球的号码的积. 例如:如果袋子里面的球的号码是{1, 1, 2 ...

  4. harukaの赛前日常

    REMEMBER US. haruka是可爱的孩子. 如题,此博客用来记录我停课后的日常. Dear Diary 10.8 上午考试. T1,直接枚举每一个点最后一次被修改的情况.(100pts) T ...

  5. [自用]数论和组合计数类数学相关(定理&证明&板子)

    0 写在前面 本文受 NaVi_Awson 的启发,甚至一些地方直接引用,在此说明. 1 数论 1.0 gcd 1.0.0 gcd $gcd(a,b) = gcd(b,a\;mod\;b)$ 证明:设 ...

  6. [总结]数论和组合计数类数学相关(定理&证明&板子)

    0 写在前面 0.0 前言 由于我太菜了,导致一些东西一学就忘,特开此文来记录下最让我头痛的数学相关问题. 一些引用的文字都注释了原文链接,若侵犯了您的权益,敬请告知:若文章中出现错误,也烦请告知. ...

  7. $\mathcal{OI}$生涯中的各种数论算法的证明

    嗯,写这个是因为我太弱了\(ORZ\). #\(\mathcal{\color{silver}{1 \ \ Linear \ \ Sieve \ \ Method \ \ of \ \ Prime}} ...

  8. 数论的欧拉定理证明 &amp; 欧拉函数公式(转载)

    欧拉函数 :欧拉函数是数论中很重要的一个函数,欧拉函数是指:对于一个正整数 n ,小于 n 且和 n 互质的正整数(包括 1)的个数,记作 φ(n) . 完全余数集合:定义小于 n 且和 n 互质的数 ...

  9. 关于数论分块里r=sum/(sum/l)的证明!

    今天的模拟赛里T2要使用到数论分块,里面有一个重要的坎就是关于r=sum/(sum/l)的证明,网上关于这道题的题解里都没有关于这个的证明,那么我就来填补一下: 在以下的文章里,我都会使用lo(x)表 ...

随机推荐

  1. mac 安装oracle

    http://www.oracle.com/technetwork/cn/database/10204macsoft-x86-64-087400-zhs.html

  2. c/c++设置图片为透明图

    在绘制图片的时候先把源位图填充背景设置为白色 例如:m_bufferpicture.FillSolidRect(0,0,m_nWidth,m_nHeight,RGB(255,255,255));//这 ...

  3. PyQt4 菜单栏 + 工具栏 + 状态栏 + 中心部件 生成一个文本编辑部件示例

    我们将创建一个菜单栏.一个工具栏.一个状态栏和一个中心部件. #!/usr/bin/python # -*- coding:utf-8 -*- import sys from PyQt4 import ...

  4. 【markdown】使用 js 实现自己得markdown 网页编辑器

    首先从这里下载其浏览器版: https://github.com/evilstreak/markdown-js/releases 解压缩后在其js文件同目录下新建一个网页进行测试,代码如下: < ...

  5. 点击button,button背景图片变化

    1.设置背景渐变效果,在drawable目录下建buttonshape.xml文件, 内容为: <?xml version="1.0" encoding="utf- ...

  6. Android内存优化总结【整理】

    http://blog.csdn.net/tiantangrenjian/article/details/39182293 [前段时间接到任务着手进行app的内存优化,从各种各样的渠道搜索相关资料,最 ...

  7. sencha touch 问题汇总

    做sencha touch有一段时间了,目前而言,sencha touch在android上问题比较严重,在此对android中sencha touch的问题做一些汇总: 1.内存问题: 打包成安装程 ...

  8. [SQL] 理解SQL SERVER中的逻辑读,预读和物理读

    SQL SERVER数据存储的形式 在谈到几种不同的读取方式之前,首先要理解SQL SERVER数据存储的方式.SQL SERVER存储的最小单位为页(Page).每一页大小为8k,SQL SERVE ...

  9. mysql导入数据失败:mysql max_allowed_packet 设置过小

    mysql根据配置文件会限制server接受的数据包大小. 有时候大的插入和更新会受max_allowed_packet 参数限制,导致写入或者更新失败. 查看目前配置 show VARIABLES ...

  10. [Jenkins] 批量删除构建历史

    Manage Jenkins -> Script Console def jobName = "Some_Job_Name" def maxNumber = 64 Jenki ...