题目描述

组合数表示的是从n个物品中选出m个物品的方案数。举个例子,从(1,2,3) 三个物品中选择两个物品可以有(1,2),(1,3),(2,3)这三种选择方法。根据组合数的定 义,我们可以给出计算组合数的一般公式:

其中n! = 1 × 2 × · · · × n

小葱想知道如果给定n,m和k,对于所有的0 <= i <= n,0 <= j <= min(i,m)有多少对 (i,j)满足是k的倍数。

输入输出格式

输入格式:

第一行有两个整数t,k,其中t代表该测试点总共有多少组测试数据,k的意义见 【问题描述】。

接下来t行每行两个整数n,m,其中n,m的意义见【问题描述】。

输出格式:

t行,每行一个整数代表答案。

输入输出样例

输入样例#1:

1 2
3 3
输出样例#1:

1
输入样例#2:

2 5
4 5
6 7
输出样例#2:

0
7

说明

【样例1说明】

在所有可能的情况中,只有是2的倍数。

【子任务】

//这个方法比较简单
//由组合数可知,c(m,n)=(n-m+1)!/(m!) ,那么要想组合数能整除k,就必须统计k的质因数 是否包涵与c的质因数。
// 用g[i]表示i中k的质因数个数
// 用f[i]表示i!中k的质因数个数
//因为2-21 中k能分解成两种不同的质因数,所以有g2,f2
//用 z[i][j]代表 c(1到j,i)中能被k整除的个数
//用 u[i][j]代表 c(1到j,1到i)中能被k整除的个数 #include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <string.h>
using namespace std;
int read() //读入优化
{
int in=,k=;char c=getchar();
for(;c>''||c<'';c=getchar()) if(c=='-') k=-;
for(;c<=''&&c>='';c=getchar())
in=in*+c-'';
return k*in;
}
int k,k2,nk,nk2,n,m,all,g[],g2[],jy[][]; int a[],f[],f2[],t,qu[][],maxn=; bool check(int n,int m) //判断组合数 C(m,n) 是否能被k整除
{
int a=f[n]-f[n-m+-];
int b=f[m];
int c=f2[n]-f2[n-m+-];
int d=f2[m];
if(a-b>=nk&&c-d>=nk2)
{
return ;
}else
return ;
} int h[][],u[][],maxm,z[][];
int main()
{
// freopen("problem.in","r",stdin);
// freopen("problem.out","w",stdout);
scanf("%d%d",&t,&k); if(k==) k=,k2=,nk=,nk2=; //打表爆力分解质因数 分成 k,k2
else if(k==) k=,k2=,nk=,nk2=;
else if(k==) k=,k2=,nk=,nk2=;
else if(k==) k=,k2=,nk=,nk2=;
else if(k==) k=,k2=,nk=,nk2=;
else if(k==) k=,k2=,nk=,nk2=;
else if(k==) k=,k2=,nk=,nk2=;
else if(k==) k=,k2=,nk=,nk2=;
else if(k==) k=,k2=,nk=,nk2=;
else if(k==) k=,k2=,nk=,nk2=;
else if(k==) k=,k2=,nk=,nk2=;
else if(k==) k=,k2=,nk=,nk2=;
else if(k==) k=,k2=,nk=,nk2=;
else if(k==) k=,k2=,nk=,nk2=;
else if(k==) k=,k2=,nk=,nk2=;
else if(k==) k=,k2=,nk=,nk2=;
else if(k==) k=,k2=,nk=,nk2=;
else if(k==) k=,k2=,nk=,nk2=;
else if(k==) k=,k2=,nk=,nk2=;
else if(k==) k=,k2=,nk=,nk2=; for(int i=;i<=t;i++)
{
qu[i][]=read();
qu[i][]=read();
qu[i][]=min(qu[i][],qu[i][]);
if(qu[i][]<qu[i][]) qu[i][]=qu[i][];
if(qu[i][]>maxn) maxn=qu[i][];
if(qu[i][]>maxm) maxm=qu[i][];
}
//计算1到最大n 的每个数中有k 有多少个
for(int i=;i<=maxn;i++)
{
int j=,q=i;
while(q%k==) q/=k,j++;
g[i]=j;
}
//计算1到最大n 的每个数中有k2 有多少个
if(k2!=)
for(int i=;i<=maxn;i++)
{
int j=,q=i;
while(q%k2==) q/=k2,j++;
g2[i]=j;
}
memset(jy,0xfffffff,sizeof(jy));
//计算前缀 即 1到i 中有多少个k
for(int i=;i<=maxn;i++)
f[i]+=f[i-]+g[i];
//1到i 中有多少个k2
if(k2!=) for(int i=;i<=maxn;i++)
f2[i]+=f2[i-]+g2[i];
//计算z与u
for(int i=;i<=maxn;i++)
for(int j=;j<=i&&j<=maxm;j++)
z[i][j]=z[i][j-]+check(i,j),
u[i][j]=u[i-][min(i-,j)]+z[i][j]; for(int i=;i<=t;i++)
printf("%d\n",u[qu[i][]][qu[i][]]);
return ;
}

Day 2 T1的更多相关文章

  1. T1加权像(T1 weighted image,T1WI)

    T1加权成像(T1-weighted imaging,T1WI)是指这种成像方法重点突出组织纵向弛豫差别,而尽量减少组织其他特性如横向弛豫等对图像的影响. 弛豫:物理用语,从某一个状态恢复到平衡态的过 ...

  2. 关于2016.12.12——T1的反思:凸包的意义与应用

    2016.12.12 T1 给n个圆,保证圆圆相离,求将圆围起来的最小周长.n<=100 就像上图.考场上,我就想用切线的角度来做凸包.以圆心x,y排序,像点凸包一样,不过用两圆之间的下切线角度 ...

  3. T2 Func<in T1,out T2>(T1 arg)

    委托调用方法的4种方式. using System; using System.Collections.Generic; namespace ConsoleApplication1 { delegat ...

  4. E1、T1链路

    北美的24路脉码调制PCM简称T1 速率是1.544Mbit/s 北美使用的T1系统共有24个话路,每个话路采样脉冲用7bit编码,然后再加上1位信令码元,因此一个话路占用8bit. 帧同步码是在24 ...

  5. Action<T1, T2>委托

    封装包含两个参数的方法委托,没有返回值. 语法 public delegate void Action<in T1, in T2>( T1 arg1, T2 arg2 ) 类型参数 in ...

  6. 有三个线程T1 T2 T3,如何保证他们按顺序执行-转载

    T3先执行,在T3的run中,调用t2.join,让t2执行完成后再执行t3 在T2的run中,调用t1.join,让t1执行完成后再让T2执行 public class Test { // 1.现在 ...

  7. 现在有T1、T2、T3三个线程,怎样保证T2在T1执行完后执行,T3在T2执行完后执行?使用Join

    public class TestJoin { public static void main(String[] args) { Thread t1 = new Thread(new T1(), &q ...

  8. 【测试】在hr用户下自行创建T1和T2表写一条SQL语句,(NL连接)

    SQL> select t1.* from t1,t2 where t1.object_id=t2.object_id; rows selected. Execution Plan ------ ...

  9. MRI中T1和T2的含义与区分[转]

    A. MRI名词解释   T1加权像.T2加权像为磁共振检查中报告中常提到的术语,很多非专业人士不明白是什么意思,要想认识何为T1加权像.T2加权像,请先了解几个基本概念:   1.磁共振(maget ...

  10. noip2015day1 T1 4510 神奇的幻方

    4510 神奇的幻方 noip2015day1 T1  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Descripti ...

随机推荐

  1. PAP认证方式原理和实现

    PAP认证协议 基本描述: Password Authentication Protocol 口令认证协议 PAP认证过程非常简单,二次握手机制,使用明文格式发送用户名和密码,发起方为被认证方,可以做 ...

  2. ubuntu14.04环境下spyder的安装

    在ubuntu14.04系统中,默认在/usr/lib目录下安装了python2.7.6和python3.4.3,在该环境下安装spyder,然后使其链接到python3.4.3. 首先安装为pyth ...

  3. Android Studio Error:CreateProcess error=216

    Error:CreateProcess error=216, This version of %1 is not compatible with the version of Windows you' ...

  4. 基于.net搭建热插拔式web框架(实现原理)

    第一节:我们为什么需要一个热插拔式的web框架? 模块之间独立开发 假设我们要做一个后台管理系统,其中包括“用户活跃度”.“产品管理”."账单管理"等模块.每个模块中有自己的业务特 ...

  5. .htaccess中Apache配置详解

    1.<IfDefine> 指令 说明 封装一组只有在启动时当测试结果为真时才生效的指令 语法 <IfDefine [!]parameter-name> ... </IfD ...

  6. Linq学习笔记四之linq to sql 的基本操作

    首先需要在项目中新增一个 linq  to sql 的服务 新增项,数据,LINQ TO sql 类的这个方法 第二步需要一个model类,用作映射 [Table] public class S_ZD ...

  7. Spring框架学习(二)

    一.Spring IOC参数值注入 1.注入基本值 1.1)<value></value>元素可以通过字符串指定属性或构造参数的值.容器将字符串从java.lang.Strin ...

  8. java中面向对象的一些知识(二)

    一. 封装的讲解 什么是封装?为什么要封装?怎么实现封装? 封装的目的是为了提高程序的安全性.封装就是把不想让第三者看的属性,方法隐藏起来. 封装的实现方法是: 1.修改属性的可见性,限制访问. 2. ...

  9. Install PIL with Jpeg support on Raspbian Jessie

    参考: https://www.raspberrypi.org/forums/viewtopic.php?f=91&t=79379 在 树莓派(Raspbian Jessie) 上安装djan ...

  10. 线性表Linearlist

    顺序存储,链式存储,索引存储,散列存储 基本运算 SLIST         1.置空表 void SetNull(&L)     2.求长度 int Length(L)     3.取元素 ...