LG P2822 NOIP2016D2T1 组合数问题
一句话题意
给定n、m和k,求对于所有的i(0<=i<=n)和j(0<=j<=min(i,m)),有多少对(i,j)使\(C_i^j\)使k的倍数
数据范围

部分分、满分做法和思路
30pts
直接暴力套公式(不用杨辉三角)
90pts
杨辉三角+二分。
具体实现:用vectorv[2005],v[i]中的元素j都是使得(i,j)可以满足要求的j。那么给定n、m后,枚举n,二分m即可。
代码:
#include<bits/stdc++.h>
using namespace std;
int T,k,c[2005][2005];
vector<int>v[2005];
int main()
{
scanf("%d %d",&T,&k);
c[0][0]=c[1][0]=c[1][1]=1;
for(int i=2;i<=2000;i++)
{
for(int j=0;j<=2000;j++)
{
c[i][j]=(c[i-1][j]+c[i-1][j-1])%k;
if(c[i][j]%k==0) v[i].push_back(j);
}
}
while(T--)
{
int n,m;
scanf("%d %d",&n,&m);
int ans=0;
for(int i=2;i<=n;i++)
{
if(v[i].size()==0) continue;
int endd=min(m,i);
int l=0,r=v[i].size()-1,mid,tans=-1;
while(l<=r)
{
mid=(l+r)/2;
if(v[i][mid]>endd) r=mid-1;
else l=mid+1,tans=mid;
}
ans+=tans+1;
}
printf("%d\n",ans);
}
return 0;
}
100pts
(其实上面那种做法在我的电脑上能A。。但洛谷上T了两个点。不知道CCF少爷机会怎么样)
二分仍然太慢。让我们考虑预处理+O(1)回答每个询问的方法:前缀和(二维的)
用qian[i][j]表示n=i,m=j时有多少组解满足要求。很好实现。(r数组是辅助数组,r[i][j]表示n=i时的一维前缀和)
#include<bits/stdc++.h>
using namespace std;
int T,k,c[2005][2005],qian[2005][2005],r[2005][2005];
bool ok[2005][2005];
//vector<int>v[2005];
int main()
{
scanf("%d %d",&T,&k);
c[0][0]=c[1][0]=c[1][1]=1;
for(int i=2;i<=2000;i++)
{
for(int j=0;j<=i;j++)
{
c[i][j]=(c[i-1][j]+c[i-1][j-1])%k;
if(c[i][j]%k==0) ok[i][j]=1;
}
}
for(int i=1;i<=2000;i++)
{
r[i][0]=ok[i][0];
for(int j=1;j<=2000;j++)
{
r[i][j]=r[i][j-1]+ok[i][j];
}
}
for(int i=1;i<=2000;i++)
{
for(int j=0;j<=2000;j++)
{
qian[i][j]=qian[i-1][j]+r[i][j];
}
}
while(T--)
{
int n,m;
scanf("%d %d",&n,&m);
/*int ans=0;
for(int i=2;i<=n;i++)
{
if(v[i].size()==0) continue;
int endd=min(m,i);
int l=0,r=v[i].size()-1,mid,tans=-1;
while(l<=r)
{
mid=(l+r)/2;
if(v[i][mid]>endd) r=mid-1;
else l=mid+1,tans=mid;
}
ans+=tans+1;
}*/
printf("%d\n",qian[n][m>n?n:m]);
}
return 0;
}
LG P2822 NOIP2016D2T1 组合数问题的更多相关文章
- 【题解】洛谷P2822 [NOIP2016TG ]组合数问题 (二维前缀和+组合数)
洛谷P2822:https://www.luogu.org/problemnew/show/P2822 思路 由于n和m都多达2000 所以暴力肯定是会WA的 因为整个组合数是不会变的 所以我们想到存 ...
- 【洛谷p2822】组合数问题
(突然想 ??忘掉了wdt) (行吧那就%%%hmr) 组合数问题[传送门] (因为清明要出去培训数学知识所以一直在做数论) 组合数<=>杨辉三角形(从wz那拐来的技能 ...
- P5689 多叉堆
写在前面 OI 生涯中 AC 的首道组合数学应用题. 开题 5min 发现规律,写了半下午代码,调了两天,然而甚至没过样例,心态崩了.几天之后重新写了一份代码才 AC. 虽然思维难度不大,但毕竟是联赛 ...
- 洛谷P2822 组合数问题(题解)
https://www.luogu.org/problemnew/show/P2822(题目传送) 先了解一下有关组合数的公式:(m在上,n在下) 组合数通项公式:C(n,m)=n!/[m!(n-m) ...
- P2822 组合数问题——巧用前缀和
P2822 组合数问题 求的是C(i,j)有多少个是k的倍数: 首先,求组合数是有技巧的, 用杨辉三角求组合数,爽的一批: 但是,这样只能得90分,两个点T了: 因为k是不变的,我们可以用前缀和的思想 ...
- Luogu P2822 组合数问题(前缀和)
P2822 组合数问题 题意 题目描述 组合数\(C_n^m\)表示的是从\(n\)个物品中选出\(m\)个物品的方案数.举个例子,从\((1,2,3)\)三个物品中选择两个物品可以有\((1,2), ...
- AC日记——组合数问题 落谷 P2822 noip2016day2T1
题目描述 组合数表示的是从n个物品中选出m个物品的方案数.举个例子,从(1,2,3) 三个物品中选择两个物品可以有(1,2),(1,3),(2,3)这三种选择方法.根据组合数的定 义,我们可以给出计算 ...
- 洛谷P2822 组合数问题
输入输出样例 输入样例#1: 1 2 3 3 输出样例#1: 1 输入样例#2: 2 5 4 5 6 7 输出样例#2: 0 7 说明 [样例1说明] 在所有可能的情况中,只有C_2^1 = 2C21 ...
- 洛谷P2822组合数问题
传送门啦 15分暴力,但看题解说暴力分有30分. 就是找到公式,然后套公式.. #include <iostream> #include <cstdio> #include & ...
随机推荐
- bzoj2733永无乡
永无乡 HYSBZ - 2733 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接, ...
- 使用Pillow(PIL)库实现中文字符画
上班摸鱼写的,不多说了,直接上脚本 #coding=utf-8 from PIL import Image from PIL import ImageDraw from PIL import Imag ...
- OUC_Summer Training_ DIV2_#16 725
今天做了这两道题真的好高兴啊!!我一直知道自己很渣,又贪玩不像别人那样用功,又没有别人有天赋.所以感觉在ACM也没有学到什么东西,没有多少进步.但是今天的B题告诉我,进步虽然不明显,但是只要坚持努力的 ...
- jquery中mouseover和mouseenter的区别
jquery中mouseover和mouseenter的区别 一.总结 一句话总结: 见名知意:enter(进入)和over(在上方)的意思好好思考一下 mouseover就是从子元素回到自己的时候也 ...
- Eureka参数配置项详解
Eureka涉及到的参数配置项数量众多,它的很多功能都是通过参数配置来实现的,了解这些参数的含义有助于我们更好的应用Eureka的各种功能,下面对Eureka的配置项做具体介绍,供大家参考. Eure ...
- 【SQL】 java.sql.SQLException: You can't specify target table 'emp' for update in FROM clause
在执行sql: delete from emp where id in (select id from emp where cdate<'2018-02-02') 时报出以下异常: ### Th ...
- java 日志文件打印
java中的日志打印 java中的日志打印: 日志工具类: log4j.properties解释: 1 1.输出级别的种类 2 ERROR.WARN.INFO.DEBUG 3 ERROR 为严 ...
- Python安装以及简单使用教程
以windows版本举例: 1.首先去Pycharm官网,或者直接输入网址:http://www.jetbrains.com/pycharm/download/#section=windows,下载P ...
- ObjectId初探
ObjectId MongoDB每个集合存储的每个文档必须有一个"_id"键,默认是个ObjectId对象. "_id"作为当前文档在集合的唯一标识. 71st ...
- oc 执行shell 脚本
-(id) InvokingShellScriptAtPath :(NSString*) shellScriptPath { NSTask *shellTask = [[NSTask alloc]in ...