Day 2 T1

题目描述

组合数表示的是从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=0,k=1;char c=getchar();
    for(;c>‘9‘||c<‘0‘;c=getchar()) if(c==‘-‘) k=-1;
    for(;c<=‘9‘&&c>=‘0‘;c=getchar())
    in=in*10+c-‘0‘;
    return k*in;
}
int k,k2,nk,nk2,n,m,all,g[2010],g2[2010],jy[2010][2010];

int a[3],f[2010],f2[2010],t,qu[10010][3],maxn=0;

bool check(int n,int m)  //判断组合数  C(m,n) 是否能被k整除
{
    int a=f[n]-f[n-m+1-1];
    int b=f[m];
    int c=f2[n]-f2[n-m+1-1];
    int d=f2[m];
    if(a-b>=nk&&c-d>=nk2)
    {
        return 1;
    }else
    return 0;
}

int h[2010][2010],u[2010][2010],maxm,z[2010][2010];
int main()
{
//    freopen("problem.in","r",stdin);
//    freopen("problem.out","w",stdout);
    scanf("%d%d",&t,&k);

    if(k==4) k=2,k2=0,nk=2,nk2=0;      //打表爆力分解质因数 分成 k,k2
    else if(k==2) k=2,k2=0,nk=1,nk2=0;
    else if(k==3) k=3,k2=0,nk=1,nk2=0;
    else if(k==5) k=5,k2=0,nk=1,nk2=0;
    else if(k==7) k=7,k2=0,nk=1,nk2=0;
    else if(k==11) k=11,k2=0,nk=1,nk2=0;
    else if(k==13) k=13,k2=0,nk=1,nk2=0;
    else if(k==17) k=17,k2=0,nk=1,nk2=0;
    else if(k==19) k=19,k2=0,nk=1,nk2=0;
    else if(k==6) k=2,k2=3,nk=1,nk2=1;
    else if(k==8) k=2,k2=0,nk=3,nk2=0;
    else if(k==9) k=3,k2=0,nk=2,nk2=0;
    else if(k==10) k=2,k2=5,nk=1,nk2=1;
    else if(k==12) k=2,k2=3,nk=2,nk2=1;
    else if(k==14) k=2,k2=7,nk=1,nk2=1;
    else if(k==15) k=5,k2=3,nk=1,nk2=1;
    else if(k==16) k=2,k2=0,nk=4,nk2=0;
    else if(k==18) k=2,k2=3,nk=1,nk2=2;
    else if(k==20) k=2,k2=5,nk=2,nk2=1;
    else if(k==21) k=7,k2=3,nk=1,nk2=1;

    for(int i=1;i<=t;i++)
    {
        qu[i][0]=read();
        qu[i][1]=read();
        qu[i][1]=min(qu[i][1],qu[i][0]);
        if(qu[i][0]<qu[i][1]) qu[i][1]=qu[i][0];
        if(qu[i][0]>maxn) maxn=qu[i][0];
        if(qu[i][1]>maxm) maxm=qu[i][1];
    }
    //计算1到最大n 的每个数中有k 有多少个
    for(int i=1;i<=maxn;i++)
    {
        int j=0,q=i;
        while(q%k==0) q/=k,j++;
        g[i]=j;
    }
    //计算1到最大n 的每个数中有k2 有多少个
    if(k2!=0)
    for(int i=1;i<=maxn;i++)
    {
        int j=0,q=i;
        while(q%k2==0) q/=k2,j++;
        g2[i]=j;
    }
    memset(jy,0xfffffff,sizeof(jy));
    //计算前缀 即 1到i 中有多少个k
    for(int i=1;i<=maxn;i++)
        f[i]+=f[i-1]+g[i];
    //1到i  中有多少个k2
    if(k2!=0) for(int i=1;i<=maxn;i++)
                f2[i]+=f2[i-1]+g2[i];
    //计算z与u
    for(int i=1;i<=maxn;i++)
        for(int j=1;j<=i&&j<=maxm;j++)
            z[i][j]=z[i][j-1]+check(i,j),
            u[i][j]=u[i-1][min(i-1,j)]+z[i][j];

    for(int i=1;i<=t;i++)
        printf("%d\n",u[qu[i][0]][qu[i][1]]);
    return 0;
}
时间: 2024-10-23 12:45:47

Day 2 T1的相关文章

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

2016.12.12 T1 给n个圆,保证圆圆相离,求将圆围起来的最小周长.n<=100 就像上图.考场上,我就想用切线的角度来做凸包.以圆心x,y排序,像点凸包一样,不过用两圆之间的下切线角度来判断. 这就是下切线(我自己瞎编的名字): 好像是对的啊: 然后我就保证必AC的希望,用这种写法交了,然后就只得了N=2的暴力分... 自以为是正解,却落得如此下场... 为什么?这样不对吗?借用学长的力量,果然被Hack掉了: 这种情况,圆心排序后,检测的顺序并不是圆上的切点的顺序,自然就会挂. 蓝瘦

C# Tuple&lt;T1,T2....T&gt;元组的使用

1) 先说组元:一个数据结构,由通过逗号分割的,用于传递给一个程序或者操作系统的一系列值的组合. NET Framework 直接支持一至七元素的元组 Tuple<T1> Tuple<T1, T2> Tuple<T1, T2, T3> Tuple<T1, T2, T3, T4> Tuple<T1, T2, T3, T4, T5> Tuple<T1, T2, T3, T4, T5, T6> Tuple<T1, T2, T3, T4

锤子T1(Smartisan T1 4G)版刷成3G版,即sm705运行sm701的CM11 Android 4.4.4ROM &#160; &#160; &#160;

对于喜欢折腾的人来说买锤子T系列真实不明智的选择,但是我是罗粉,对于锤子安卓内核版本的不升级政策很是不满,我承认Smartisan OS确实很好用,用了iOS后才知道锤子的系统真好,高效贴心真心替用户考虑.说了这么多我还是转战了iphone,早期的T1用户真心被伤透了心,锤子变成了备用机,刷机热一起来就像突破限制,但是4G版的真心支持的ROM不多,看图比较:(图片来自刷机精灵) 4G版的值支持Smsrtisan OS(经试验证明发现tencent os4G版刷机不支持,一直失败),死来想去决定试

4、定时器T1通过查询方式控制LED1周期性闪烁(轮训方式)

定时器T1通过查询方式控制LED1周期性闪烁 1 /**************************************************************************** 2 * 文 件 名: main.c 3 * 作 者: Amo [ www.amoMcu.com 阿莫单片机] 4 * 修 订: 2014-04-08 5 * 版 本: 1.0 6 * 描 述: 定时器T1通过查询方式控制LED1周期性闪烁 7 *************************

判断T2是否是T1的子树

基本模仿CC150上的思路,递归地在t1中寻找能与t2的根相同的节点,作为开始比较的开始点,然后递归的比较两个树是否相等. boolean containsTree(TreeNode t1, TreeNode t2){ if(t2==null) return true; return subTree(t1,t2); } boolean subTree(TreeNode t1, TreeNode t2){ if(t1==null) return false; if(t1.val ==t2.val)

FJ省队集训DAY3 T1

思路:我们考虑如果取掉一个部分,那么能影响到最优解的只有离它最近的那两个部分. 因此我们考虑堆维护最小的部分,离散化离散掉区间,然后用线段树维护区间有没有雪,最后用平衡树在线段的左右端点上面维护最小的id 我讲的貌似不是很清楚.. 还有,蜜汁80分,打死也改不出来.. 1 #include<cstdio> 2 #include<cmath> 3 #include<iostream> 4 #include<cstring> 5 #include<algo

Day4:T1小技巧(类似于指针操作)T2搜索+小细节

Day4:其中有很多小技巧get T1 一直没有听到过像这样的小技巧的略专业名词,有点类似于指针操作,之前有碰到过很多这样的题目 每次都是以不同的形式出现,但是感觉思想还是有点接近的吧(就比如某天有一题happy,貌似也是这类型的) 这类题目第一眼总是看起来特别的不能写,其实想到了这些技巧之后很简单 感觉这也没有什么规律性或是模板可言 大概的,就是指针思想+平时积累吧 说说这一题吧 在分析正解之前,我们先说一说比较容易想到的骗分方法 设男女人数相同时ans=0,如果下一个是男->ans++,el

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

A. MRI名词解释 T1加权像.T2加权像为磁共振检查中报告中常提到的术语,很多非专业人士不明白是什么意思,要想认识何为T1加权像.T2加权像,请先了解几个基本概念: 1.磁共振(mageticresonanceMR):在恒定磁场中的核子,在相应的射频脉冲激发后,其电磁能量的吸收和释放,称为磁共振. 2.TR(repetitiontime):又称重复时间.MRI的信号很弱,为提高MR的信噪比,要求重复使用同一种脉冲序列,这个重复激发的间隔时间即称TR. 3.TE(echedelaytime):

现有T1、T2、T3三个线程,你怎样保证T2在T1执行完成之后执行,T3在T2执行完后执行?

考察join /**  * 现有T1.T2.T3三个线程,你怎样保证T2在T1执行完成之后执行,T3在T2执行完后执行?  * @author user  *  */ public class Test3 { public static void main(String[] args) throws InterruptedException { Thread T1 = new Thread(new T1()); Thread T2 = new Thread(new T2()); Thread T

noi题库(noi.openjudge.cn) 3.9数据结构之C++STL T1——T2

T1 1806:词典 描述 你旅游到了一个国外的城市.那里的人们说的外国语言你不能理解.不过幸运的是,你有一本词典可以帮助你. 输入首先输入一个词典,词典中包含不超过100000个词条,每个词条占据一行.每一个词条包括一个英文单词和一个外语单词,两个单词之间用一个空格隔开.而且在词典中不会有某个外语单词出现超过两次.词典之后是一个空行,然后给出一个由外语单词组成的文档,文档不超过100000行,而且每行只包括一个外语单词.输入中出现单词只包括小写字母,而且长度不会超过10.输出在输出中,你需要把