关闭

TJU4111-Binomial efficient(数论)

标签: acmhdoj数论
366人阅读 评论(0) 收藏 举报
分类:

对2^32取模-->直接用unsigned long,运算过程中 溢出就等同于对2^32取模,不必再特殊处理。

首先用筛选法打出素数表,然后对n!,m!,(n-m)!进行质因数分解。

把组合数用底数和指数的形式表达出来,最后用快速幂计算相加即可。

#include <cstdio>
#include <cstring>
typedef long long LL;
typedef unsigned int uint;

using namespace std;

const int N=1000000;

//v为素数表,a为底数,b为指数
int a[N+10],b[N+10],v[N+10];
int cnt;

uint quickpow(uint x,int y)
{
    uint res=1;
    for(;y;y>>=1)
    {
        if(y&1) res=res*x;
        x=x*x;
    }
    return res;
}

void Init()
{
    int i,j;
    memset(v,0,sizeof(v));
    cnt=0;
    for(i=2;i<=N;i++)
    {
        if(v[i]==0)
        {
            a[cnt++]=i;
            for(j=i+i;j<=N;j+=i) v[j]=1;
        }
    }
}


void work()
{
    int i,j,n,m;
    uint ans=1;
    scanf("%d%d",&n,&m);

    for(i=0;i<cnt;i++)
        if(n>=a[i])
        {
            b[i]=0;
            for(LL j=a[i]; j<=n;   j*=(LL)a[i]) b[i]+=n/j;
            for(LL j=a[i]; j<=m;   j*=(LL)a[i]) b[i]-=m/j;
            for(LL j=a[i]; j<=n-m; j*=(LL)a[i]) b[i]-=(n-m)/j;
        }
        else break;
    for(j=0;j<i;j++) ans=ans*quickpow(a[j],b[j]);
    printf("%u\n",ans);
}


int main()
{
    int T;
    Init();
    scanf("%d",&T);
    while(T--) work();
    return 0;
}


0
0
查看评论

ACM 数论知识 合集

关于欧几里得的那些事真是醉了啊,刚才写了两个小时的博文,想保存到草稿箱里,结果显示服务器异常,结果返回一看,卧槽,写的都没了,心中是万千草泥马呼啸而过呀。。。还得从新写呀。欧几里得算法最大公约数问题是最早被研究的算法问题之一了,并且是ACM竞赛中能涉及到的很 多数论内容,比如模线性方程,模线性方程组...
  • baidu_33153085
  • baidu_33153085
  • 2016-08-06 16:50
  • 3409

部分OI常用数论符号集锦

部分数论符号集锦背景学OI,里面有一种叫做数论题的题目,简单的数论题还简单,可是越学就发现越烦了,什么欧拉函数、莫比乌斯反演、某某筛之类的,真的一点都看不懂 那么,怎么办呢,想要学数论先要会其相关符号吧,今天本蒟蒻整理出了部分常见OI用到的数论符号 (注:本蒟蒻是C++选手,采用传统C++代码)...
  • zhouyuheng2003
  • zhouyuheng2003
  • 2017-09-25 16:24
  • 385

数论基础讲解

数论,顾名思义,是对整数进行研究的理论。是数学学科的一个重要分支,也是ACM竞赛题型中饶有趣味的一个部分。   数论,有人戏称为“素论”。可见对于素数的研究在数论中比重之大。当然,也有不是对素数操作的算法,在这里我们也将其划归为数论。     1、整除:  1.1.&#...
  • judyge
  • judyge
  • 2015-04-15 12:08
  • 407

11个基本数论知识

 1、本原勾股数: 概念:一个三元组(a,b,c),其中a,b,c没有公因数而且满足:a^2+b^2=c^2 首先,这种本原勾股数的个数是无限的,而且构造的条件满足: a=s*t,b=(s^2-t^2)/2,c=(s^2+t^2)/2 其中s>t>=1是任意没有公因数的奇数...
  • Songjs19931206
  • Songjs19931206
  • 2015-01-20 12:39
  • 1019

noip 数论总结

终于做完了noip理论上是数论的题(其实小半个月前就做完了) 不得不说,noip的数论还是有很难、比较麻烦的。 但大多数是质因数分解(细胞分裂、、、)和  gcd  还有伪装成gcd但做成质因数分解能过的(hankson的趣味题、、、) 普及组dt高精快速幂 &#...
  • haobang866
  • haobang866
  • 2017-05-06 17:11
  • 863

新知——快速数论变换

快速数论变换 学习笔记
  • kyleyoung_ymj
  • kyleyoung_ymj
  • 2016-08-15 22:34
  • 1541

数论著作读书笔记(2013-04-14 23:22)

谈谈代数数论_代数数论百年历史回顾及分期初探_黎景辉 http://wenku.baidu.com/link?url=hawGPEHnHRm-mmVFy6a8_qOfXT08qe9Gd7CjZZ1wrF5Yi1WJdT5JOFyzmUqIngIklMqXk8UQtx5grjKAjeIYVnDUSX...
  • u010401391
  • u010401391
  • 2015-11-06 19:24
  • 1271

UVA 11020 - Efficient Solutions(set)

UVA 11020 - Efficient Solutions 题目链接 题意:每个人有两个属性值(x, y),对于每一个人(x,y)而言,当有另一个人(x', y'),如果他们的属性值满足x' 思路:由于每个人失去优势后,不可能再得到优势,所以失去优势就...
  • u011217342
  • u011217342
  • 2014-08-24 00:27
  • 1078

Uva-11020-Efficient Solutions

入门经典上面关于BST树应用的一个题~用标准模板库做就比较简单了~唯一需要注意一点的就是最后没有那个多的换行符,否则WA~ 代码: #include #include #include #include using namespace std; struct Node { int x,y...
  • z309241990
  • z309241990
  • 2013-04-25 22:47
  • 604

数论常见定理汇总

入门数论,做题时候好多定理老是忘,这里汇总下吧,不定期更新。 ps:来源有大牛一号 1、欧拉函数:求小于或等于n的数中与n互质的数的数目。记为φ(n)。 (1)、欧拉定理:若a与n互质,那么有a^φ(n) ≡ 1(mod n),经常用于求幂的模。 (2)、若p是一个质数,那么φ(...
  • Flynn_curry
  • Flynn_curry
  • 2017-02-21 22:20
  • 293
    个人资料
    • 访问:30154次
    • 积分:1101
    • 等级:
    • 排名:千里之外
    • 原创:82篇
    • 转载:3篇
    • 译文:0篇
    • 评论:3条
    文章分类
    最新评论