题目:https://www.luogu.org/problemnew/show/P2822

阶乘太大,算不了;

但 k 只有 8 个质因子嘛,暴力60分;

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int const maxn=;
int n,m,t,K,pri[]={,,,,,,,},num[],tp[],pk[],tp2[],tt[];
void gt(int x,int t[])//x
{
for(int i=;i<;i++)
{
t[i]=;
if(x==||x==)continue;
while(x%pri[i]==)x/=pri[i],t[i]++;
}
}
void get(int x,int num[])//x!
{
for(int i=;i<;i++)num[i]=;
if(x==||x==)return;
for(int i=;i<=x;i++)
{
gt(i,tt);
for(int j=;j<;j++)num[j]+=tt[j];
}
}
int main()
{
scanf("%d%d",&t,&K); gt(K,pk);
while(t--)
{
scanf("%d%d",&n,&m); int ans=;
for(int i=;i<=n;i++)
{
get(i,num); memcpy(tp2,num,sizeof num);
for(int j=;j<=min(i,m);j++)
{
get(j,tp);
for(int k=;k<;k++)num[k]-=tp[k];
get(i-j,tp);
bool fl=;
for(int k=;k<;k++)
{
num[k]-=tp[k];
if(num[k]<pk[k]){fl=; break;}
}
if(!fl)ans++;
memcpy(num,tp2,sizeof tp2);
}
}
printf("%d\n",ans);
}
return ;
}

60分

把这个优化一下就能过了;

1.DP,f[i][j] 表示 n <= i , m <= j 的 C(n,m) 中有多少数是 k 的倍数,毕竟 k 是固定的;

2. x! 分解质因子不用枚举,而是那个做法,p1 倍数有 x / p 个,p2 的倍数有 x / p / p 个...

3.阶乘分解质因子的结果预处理出来,直接调用。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int const maxn=,maxm=1e4+;
int T,K,f[maxn][maxn],pri[]={,,,,,,,},num[],t1[];
int n[maxm],m[maxm],mxn,mxm,s[maxn][];
int rd()
{
int ret=,f=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-; ch=getchar();}
while(ch>=''&&ch<='')ret=(ret<<)+(ret<<)+ch-'',ch=getchar();
return ret*f;
}
void get(int x,int t[],int val)//x
{
for(int i=;i<&&pri[i]<=x;i++)
{
if(x==||x==)return;
while(x%pri[i]==)x/=pri[i],t[i]+=val;
}
}
void getx(int x,int t[],int val)//x!
{
int tmp=x;
for(int i=;i<;i++)
{
x=tmp;
while(x)t[i]+=(x/pri[i])*val,x/=pri[i];
}
}
int work(int x,int y)
{
memset(t1,,sizeof t1);
for(int i=;i<;i++)
{
t1[i]=s[x][i]-s[y][i]-s[x-y][i];
if(t1[i]<num[i])return ;
}
return ;
}
void init()
{
get(K,num,);
for(int i=;i<=mxn;i++)
{
memset(t1,,sizeof t1);
getx(i,t1,); memcpy(s[i],t1,sizeof t1);//阶乘质因子也预处理!
}
for(int i=;i<=mxn;i++)
{
for(int j=;j<=mxm&&j<i;j++)
f[i][j]=f[i-][j]+f[i][j-]-f[i-][j-]+work(i,j);
for(int j=i;j<=mxm;j++)f[i][j]=f[i][j-];
}
}
int main()
{
T=rd(); K=rd();
for(int i=;i<=T;i++)
{
n[i]=rd(); m[i]=rd();
mxn=max(mxn,n[i]); mxm=max(mxm,m[i]);
}
init();
for(int i=;i<=T;i++)printf("%d\n",f[n[i]][m[i]]);
return ;
}

洛谷 P2822 [ NOIP 2017 ] 组合数问题 —— 数学的更多相关文章

  1. 洛谷 P3951 NOIP 2017 小凯的疑惑

    洛谷 P3951 NOIP 2017 小凯的疑惑 题目描述 小凯手中有两种面值的金币,两种面值均为正整数且彼此互素.每种金币小凯都有 无数个.在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付 ...

  2. 洛谷 P3960 [ NOIP 2017 ] 列队 —— 线段树

    题目:https://www.luogu.org/problemnew/show/P3960 NOIP 题,不用很复杂的数据结构...但又参考了许多: 要求支持维护删除第 k 个和在末尾插入的数据结构 ...

  3. 洛谷 P3953 [ NOIP 2017 ] 逛公园 —— 最短路DP

    题目:https://www.luogu.org/problemnew/show/P3953 主要是看题解...还是觉得好难想啊... dfs DP,剩余容量的损耗是边权减去两点最短路差值...表示对 ...

  4. 【题解】洛谷P2822 [NOIP2016TG ]组合数问题 (二维前缀和+组合数)

    洛谷P2822:https://www.luogu.org/problemnew/show/P2822 思路 由于n和m都多达2000 所以暴力肯定是会WA的 因为整个组合数是不会变的 所以我们想到存 ...

  5. 【noip】跟着洛谷刷noip题2

    noip好难呀. 上一个感觉有点长了,重开一个. 36.Vigenère 密码 粘个Openjudge上的代码 #include<cstdio> #include<iostream& ...

  6. 洛谷模拟NOIP考试反思

    洛谷模拟NOIP考试反思 想法 考了这么简单的试qwq然而依然emmmmmm成绩不好 虽然本次难度应该是大于正常PJ难度的但还是很不理想,离预估分数差很多qwq 于是就有了本反思嘤嘤嘤 比赛链接 原比 ...

  7. 【noip】跟着洛谷刷noip题

    传送门 1.铺地毯 d1t1 模拟 //Twenty #include<cstdio> #include<cstdlib> #include<iostream> # ...

  8. 洛谷P3951 小凯的疑惑 - 数学 /扩展欧几里得

    传送门 题意:求出a和b不能通过线性组合(即n*a+m*b)得到的最大值: 思路:摘自洛谷: 不妨设 a<b 假设答案为 x 若 x≡m*a ( mod b )(1≤m≤b−1) (mod3)什 ...

  9. 洛谷P2835 刻录光盘 [2017年6月计划 强连通分量02]

    P2835 刻录光盘 题目描述 在JSOI2005夏令营快要结束的时候,很多营员提出来要把整个夏令营期间的资料刻录成一张光盘给大家,以便大家回去后继续学习.组委会觉得这个主意不错!可是组委会一时没有足 ...

随机推荐

  1. PHP程序员必须知道的两种日志

    前言 作为一名程序员,比码代码还重要那么一点点的东西就是日志的分析和查询.下面列出常见日志及设置方法. php-fpm 慢日志 php慢日志需要在php-fpm.conf设置,如果使用源码包安装默认请 ...

  2. LeetCode(6) ZigZag Conversion

    题目 The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows li ...

  3. ROS 笔记 程序包/节点/topic

    官方教程: wiki.ros.org/cn/ROS/tutorials 程序包打创建于编译 创建程序包 在工作空间的src底下,输入如下命令: $ catkin_create_pkg 要创建的包名 依 ...

  4. Leetcode 143.重排链表

    重排链表 给定一个单链表 L:L0→L1→…→Ln-1→Ln ,将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→… 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 示 ...

  5. centOS 7 换ssh端口

    centos 最少安装时缺少semanage的,要这样装补上,因为默认是安装了SElinux的 [root@localhost ~]# sestatus SELinux status: enabled ...

  6. hdu 5093 二分匹配

    /* 题意:给你一些冰岛.公共海域和浮冰,冰岛可以隔开两个公共海域,浮冰无影响 求选尽可能多的选一些公共海域点每行每列仅能选一个. 限制条件:冰山可以隔开这个限制条件.即*#*可以选两个 预处理: * ...

  7. 【ZJOI2017 Round1练习&BZOJ4773】D3T1 cycle(最小负环,倍增)

    题意:给定一个带权有向图,求点数最小的负环. 2 ⩽ n ⩽ 3000 ⩽ m ⩽ n(n - 1)1 ⩽ ui,vi ⩽ nabs(w[j])<= 10^4 思路:倍增思想 设d[i,j,k] ...

  8. 【BZOJ3697】采药人的路径(点分治)

    题意:采药人的药田是一个树状结构,每条路径上都种植着同种药材.采药人以自己对药材独到的见解,对每种药材进行了分类.大致分为两类,一种是阴性的,一种是阳性的.采药人每天都要进行采药活动.他选择的路径是很 ...

  9. 「CodePlus 2017 12 月赛」火锅盛宴

    n<=100000种食物,给每个食物煮熟时间,有q<=500000个操作:在某时刻插入某个食物:查询熟食中编号最小的并删除之:查询是否有编号为id的食物,如果有查询是否有编号为id的熟食, ...

  10. 04-js的运算符

    <html> <head> <title>js的运算符学习</title> <meta charset="UTF-8"/> ...