*HDU3398 数学

String

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2552    Accepted Submission(s): 755

Problem Description

Recently,
lxhgww received a task : to generate strings contain ‘0‘s and ‘1‘s
only, in which ‘0‘ appears exactly m times, ‘1‘ appears exactly n times.
Also, any prefix string of it must satisfy the situation that the
number of 1‘s can not be smaller than the number of 0‘s . But he can‘t
calculate the number of satisfied strings. Can you help him?

Input

T(T<=100) in the first line is the case number.
Each case contains two numbers n and m( 1 <= m <= n <= 1000000 ).

Output

Output the number of satisfied strings % 20100501.

Sample Input

1

2 2

Sample Output

2

Author

lxhgww

Source

HDOJ Monthly Contest – 2010.05.01

题意:

0,1组成的串,前缀中1始终多于0.

求卡特兰数但是数据是1000000;

代码:

//C(n+m,n)-C(n+m,n+1)=(n+m)!*(n+1-m)/m!*(n+1)!;
//卡特兰数,数据太大。n个1,m个0,从(0,0)出发可以将1看作是向上走,0看作是向右走,这样合法的路径必定在直线y=x-1上方且不与他相交
//做(0,0)关于y=x-1的对称点(1,-1),从(1,-1)出发到终点(m,n)的路径必定与直线相交,将这条路径关于y=x-1对称过去就是从(0,0)
//到终点(n,m)不合法的情况。用总的减去就行
//求n,n!质因数模板
#include<bits\stdc++.h>
using namespace std;
typedef long long ll;
#define mod 20100501
#define maxm 2000006
#define maxn 1000006
int p[maxn];
int prime[maxn],res,num;
bool is_prime[maxm];
void get_prime()         //得到素数表
{
    prime[0]=2;
    res=1;
    for(int i=3;i<maxm;i+=2)
        if(!is_prime[i])
        {
            for(int j=i;j<maxm;j+=i)
                is_prime[j]=1;
            prime[res++]=i;
        }
}
void divide1(int x)   //分解x的质因数
{
    int cnt=0;
    while(x>1)
    {
        while(x%prime[cnt]==0)
        {
            p[cnt]++;
            x/=prime[cnt];
        }
        cnt++;
    }
    num=max(num,cnt);
}
void divide2(int x,bool flag)  //分解x!的质因数,flag判断是分子还是分母
{
    int cnt=0;
    while(prime[cnt]<=x)
    {
        int tem=x;
        while(tem)
        {
            if(flag)
            p[cnt]+=tem/prime[cnt];
            else p[cnt]-=tem/prime[cnt];
            tem/=prime[cnt];
        }
        cnt++;
    }
    num=max(num,cnt);
}
ll make(ll x,ll y)   //x,y不知为何用int就不行,得到x^y。
{
    ll ans=1;
    x%=mod;
    while(y)      //很巧妙
    {
        if(y&1)
        ans=(ans*x)%mod;
        x=(x*x)%mod;
        y/=2;
    }
    return ans;
}
ll get_ans()
{
    ll ans=1;
    for(int i=0;i<=num;i++)
    {
        if(p[i])
        ans=make(prime[i],p[i])*ans%mod;
    }
    return ans;
}
int main()
{
    int t,n,m;
    scanf("%d",&t);
    get_prime();
    while(t--)
    {
        num=0;
        memset(p,0,sizeof(p));
        scanf("%d%d",&n,&m);
        divide1(n+1-m);
        divide2(n+m,1);
        divide2(m,0);
        divide2(n+1,0);
        ll ans=get_ans();
        printf("%lld\n",ans);
    }
    return 0;
}
时间: 2024-10-10 15:35:11

*HDU3398 数学的相关文章

[HNOI2011]数学作业

题目描述 小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题: 给定正整数 N 和 M,要求计算 Concatenate (1 .. N) Mod M 的值,其中 Concatenate (1 ..N)是将所有正整数 1, 2, -, N 顺序连接起来得到的数.例如,N = 13, Concatenate (1 .. N)=12345678910111213.小C 想了大半天终于意识到这是一道不可能手算出来的题目,于是他只好向你求助,希望你能编写一个程序帮他解决这个问题. 输入输

codeforces_346A Alice and Bob(数学)

题目链接:http://codeforces.com/problemset/problem/346/A 参考链接:http://blog.csdn.net/loy_184548/article/details/50174615 感受到数学在博弈论中的强大. 考虑最后终止状态的序列-无法取出任意两个数他们的差值不存在这个序列中:那么这必定是个首项等于公差的等差序列 而这个序列是 d 2d 3d....,因此可以通过a[1] a[2] a[3] ...的最大公约数得到 然后计算有几个数没在数组中,判

UVA 10089 Repackaging 数学问题

大致题意:给出几个包裹,每个包裹都包装好了3种大小的杯子.现在要重新包装,使向量 a[1]*(s[1][1],s[1][2],s[1][3])+a[2]*(s[2][1],s[2][2],s[2][3])+.....+a[n]*(s[n][1],s[n][2],s[n][3])=(k,k,k). 就这样转化成了向量问题其中a[i]为非负整数,k为正整数. 虽然转化成了向量问题,但是三维向量和这么多变量有点棘手,所以我们可以先降维,将原等式变化成: a[1]*(s[1][2]-s[1][1],s[

图像处理中的数学原理详解17——卷积定理及其证明

欢迎关注我的博客专栏"图像处理中的数学原理详解" 全文目录请见 图像处理中的数学原理详解(总纲) http://blog.csdn.net/baimafujinji/article/details/48467225 图像处理中的数学原理详解(已发布的部分链接整理) http://blog.csdn.net/baimafujinji/article/details/48751037 1.4.5   卷积定理及其证明 卷积定理是傅立叶变换满足的一个重要性质.卷积定理指出,函数卷积的傅立叶变

如何入门参加数学建模竞赛

1 网上资源 1.1 数学中国 可以去数学中国网站看看,在数学建模比赛的培训这一块做得很好的机构,如果自己有点银子,可以去参加他们的网上课程.另外他们有专门的数学建模群,群里面有很好关于数学建模的资料.而且这个机构自己也举办数学建模比赛,如果有时候可以在这里组队,直接参加比赛,累积一些经验,增长见识. 1.2 数学建模视频课程,现在网络上有一些比较好的关于数学建模比赛的视频资源,可以谷歌一下 1.3 网络上的一些关于数学建模的电子书,有时候你也不知道哪本书比较适合你,所以你可以先在网上找一些电子

第三周项目4-考了语文数学的学生

下面提供了类Stu的数据成员定义,和用于测试的main函数,参考如图的运行结果,完成类的定义. /* * Copyright (c) 2015,烟台大学计算机学院 * All right reserved. * 作者:邵帅 * 文件:Demo.cpp * 完成时间:2015年03月21日 * 版本号:v1.0 */ #include<iostream> #include<string> using namespace std; class Stu { private: string

51nod 1138 连续整数的和(数学)

题目描述: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1138 给出一个正整数N,将N写为若干个连续数字和的形式(长度 >= 2).例如N = 15,可以写为1 + 2 + 3 + 4 + 5,也可以写为4 + 5 + 6,或7 + 8.如果不能写为若干个连续整数的和,则输出No Solution. Input 输入1个数N(3 <= N <= 10^9). OutPut 输出连续整数中的第1个数,如果有多

[笔记]shell编程:数学计算

在shell Script中,有好几种进行数学运算的方法,虽然有几个效果差不多,在编写程序的时候使用一种方法就够了,但是我们可能还需要学习别人的程序啊,在阅读别人的程序的时候不能不认识这些东西吧.所以,留个笔记. 一.expr 命令  --  expr 允许在命令行上处理数学表达式,但是略显拙劣. 例:$ expr 1 + 5    #注意在表达式中要有空格,如果写成1+5那么结果就不是我们想要的了. expr命令能够识别一些不同的数学和字符串操作符: 操作符 描述 arg1 | arg2 如果

hdoj 3750 Guess Game 【数学之二分】

题意:用二分法找出数学期望. 策略,二分. 求数学期望有两种方法,一:求出每一个数的概率,再与数相乘,最后把所有的乘积相加就好了. 二:数学期望总是与平均数相等,所以可以当做求平均数.(简单方便) 代码: #include <stdio.h> #include <string.h> int sum; void bi_sear(int n){ sum = 0; int temp, i, left, right, mid; for(i = 1; i <= n; i ++){ te