2017.9.24 noip模拟赛 day2—组合数

简化版题意:

给定n,m(n<=m),求C(n,m)的末尾有几个0

输入格式:

第一行一个整数t,代表数据组数。

接下来t行,每行两个整数n,m

输出格式:

t行,每行一个整数,代表C(n,m)的末尾0的个数。

样例输入:

3
10 1
11 7
20 4

样例输出:

1
1
0

数据范围:

1<=m<=n<=1000000,t<=1000

首先这道题需要知道一个公式:C(n,m)=n!/(n-m)!*m!

然后10=2*5,也就是说,对于一个数,我们将其因数分解,2和5中较少的数的个数,就是该数末尾0的个数。

于是对于每一组数据,暴力算出上下两式中2和5的个数,然后上下因为是除的关系,所以可以相互抵消,于是上下的数中2的个数和5的个数中较少的就是0的个数了。

吐槽一句:题解中说,要用前缀和,但是我并没有写任何与前缀和相关的代码,但是还是A了。

再加一句:对于一个数的阶乘,2的个数一定是比5多的,所以这个题其实只需要输出5的个数就好了。。。比较大小只是保险而已。

#include<cstdio>
void read(int &y)
{
    y=0;char x=getchar();
    while(x<‘0‘||x>‘9‘) x=getchar();
    while(x>=‘0‘&&x<=‘9‘)
    {
        y=y*10+x-‘0‘;
        x=getchar();
    }
}
int solve2(int x)
{
    int s=0;
    while(x/2!=0)
    {
        s+=x/2;
        x/=2;
    }
    return s;
}
int solve5(int x)
{
    int s=0;
    while(x/5!=0)
    {
        s+=x/5;
        x/=5;
    }
    return s;
}
int min(int x,int y)
{
    return x<y ? x : y;
}
int t,m,n;
int main()
{
    read(t);
    while(t--)
    {
        read(m),read(n);
        int x=solve2(m)-(solve2(n)+solve2(m-n));
        int y=solve5(m)-(solve5(n)+solve5(m-n));
        printf("%d\n",min(x,y));
    }
    return 0;
}
时间: 2024-10-03 13:21:11

2017.9.24 noip模拟赛 day2—组合数的相关文章

2017 9 11 noip模拟赛T2

#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=205; int map[N][N]; int d[N],tag[N],book[N],f[N]; int n,m; void work(int x) { memset(d,63,sizeof(d)); memset(book,0,sizeof(book)); memset(f,0,sizeof(

CH Round #55 - Streaming #6 (NOIP模拟赛day2)解题报告

T1九九归一 描述 萌蛋在练习模n意义下的乘法时发现,总有一些数,在自乘若干次以后,会变成1.例如n=7,那么5×5 mod 7=4,4×5 mod 7=6,6×5 mod 7=2,2×5 mod 7=3,3×5 mod 7=1.如果继续乘下去,就会陷入循环当中.萌蛋还发现,这个循环的长度经常会是φ(n),即小于n且与n互质的正整数的个数.例如,φ(7)=6,而上述循环的长度也是6,因为5,4,6,2,3,1共有6个数.再如n=6,那么5×5 mod 6=1.这个循环的长度很短,只有2,而恰好φ

2016.10.30 NOIP模拟赛 day2 PM 整理

满分:300分 直接全部爆零,真的是很坑啊! 10.30的题目+数据:链接:http://pan.baidu.com/s/1jHXLace 密码:i784 T1: 题目中的难点就是每次折叠的点可能应经被覆盖了,我的做法是递归去推出它现在在哪个位置,不仅超时,而且答案错误. 也曾想过用数组去存下它当前的位置,但是被10^18的数据吓到了. 正解:并不是所有的坐标都有用,仅仅是那m个将要用到的点有用,所以每次折叠,就只对之后的有用的k个点进行更新,这样就行了. 时间复杂度O(m^2) 不会超时的.

2016.10.30 NOIP模拟赛 day2 AM 整理

题目+数据:链接:http://pan.baidu.com/s/1gfBg4h1 密码:ho7o 总共得了:130分, 1:100分  2:30分(只会这30分的暴力) 3:0(毫无思路) 虽然不高,但是比较满意,因为把自己会的分数都拿到了. T1:100分 1 /* 2 T1明显是个数论题. 3 正确的思路:把n!质因数分解,把所有质因数的指数都取到最大的偶数,它们的乘积便是最终的结果. 4 有一种很快的方法在Eular筛中可以n!的质因数分解. 5 if(!is_prim[i]) 6 { 7

2017 11.6 NOIP模拟赛

1.数学老师的报复(attack.pas/c/cpp)[问题描述]11 班数学大佬 YXN 又在上数学课的时候把班主任 MP6 的错误当众挑出来了,MP6 再一次感到很难堪,于是决定报复 YXNMP6 对 YXN 说:给你一个函数 f(x),定义如下:f ( 1 ) = 1f ( 2 ) = 1f ( n ) = ( A * f ( n - 1 ) + B * f ( n - 2 ) ) mod 7.YXN 说这还不简单,可以秒杀!MP6 微微笑了笑说:n 等于 100 你算得出来,那 n 等于

2017 9 15 noip模拟赛

t1: #include<cstdio> #include<cstring> const int N=1000010; int a[N],b[N]; int sum=1,maxx=0; int main() { freopen("sequence.in","r",stdin); freopen("sequence.out","w",stdout); int n; scanf("%d"

2017.5.27 NOIP模拟赛(hzwer2014-5-16 NOIP模拟赛)

期望得分:100+100+60+30=290 实际得分:100+20+60+0=180 当务之急:提高一次正确率 Problem 1 双色球(ball.cpp/c/pas) [题目描述] 机房来了新一届的学弟学妹,邪恶的chenzeyu97发现一位学弟与他同名,于是他当起了善良的学长233 “来来来,学弟,我考你道水题检验一下你的水平……” 一个栈内初始有n个红色和蓝色的小球,请你按照以下规则进行操作 只要栈顶的小球是红色的,将其取出,直到栈顶的球是蓝色 然后将栈顶的蓝球变成红色 最后放入若干个

【简单思考】noip模拟赛 NTR酋长

NTR酋长 (ntr.pas/.c/.cpp) 黄巨大终于如愿以偿的进入了czy的后宫中……但是czy很生气……他要在黄巨大走到他面前的必经之路上放上几个NTR酋长来阻挡黄巨大. 众所周知,NTR酋长有一个技能是沟壑(F).它会在地图上产生一条长长的障碍物阻挡人前进.Czy打算在一个n*m的矩形(必经之路?)中放上NTR酋长.NTR酋长要一个一个放下去,而且每放一个都会向四角倾斜的方向放出无限长的沟壑,而已经被沟壑挡住的地方就不能再放NTR酋长了. 请注意:不会出现沟壑的路径挡住另一个沟壑的情况

NOIP模拟赛 6.29

2017-6-29 NOIP模拟赛 Problem 1 机器人(robot.cpp/c/pas) [题目描述] 早苗入手了最新的Gundam模型.最新款自然有着与以往不同的功能,那就是它能够自动行走,厉害吧. 早苗的新模型可以按照输入的命令进行移动,命令包括‘E’.‘S’.‘W’.‘N’四种,分别对应东南西北.执行某个命令时,它会向对应方向移动一个单位.作为新型机器人,它可以执行命令串.对于输入的命令串,每一秒它会按命令行动一次.执行完命令串的最后一个命令后,会自动从头开始循环.在0时刻时机器人