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

阶乘太大,算不了;

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

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. using namespace std;
  6. int const maxn=;
  7. int n,m,t,K,pri[]={,,,,,,,},num[],tp[],pk[],tp2[],tt[];
  8. void gt(int x,int t[])//x
  9. {
  10. for(int i=;i<;i++)
  11. {
  12. t[i]=;
  13. if(x==||x==)continue;
  14. while(x%pri[i]==)x/=pri[i],t[i]++;
  15. }
  16. }
  17. void get(int x,int num[])//x!
  18. {
  19. for(int i=;i<;i++)num[i]=;
  20. if(x==||x==)return;
  21. for(int i=;i<=x;i++)
  22. {
  23. gt(i,tt);
  24. for(int j=;j<;j++)num[j]+=tt[j];
  25. }
  26. }
  27. int main()
  28. {
  29. scanf("%d%d",&t,&K); gt(K,pk);
  30. while(t--)
  31. {
  32. scanf("%d%d",&n,&m); int ans=;
  33. for(int i=;i<=n;i++)
  34. {
  35. get(i,num); memcpy(tp2,num,sizeof num);
  36. for(int j=;j<=min(i,m);j++)
  37. {
  38. get(j,tp);
  39. for(int k=;k<;k++)num[k]-=tp[k];
  40. get(i-j,tp);
  41. bool fl=;
  42. for(int k=;k<;k++)
  43. {
  44. num[k]-=tp[k];
  45. if(num[k]<pk[k]){fl=; break;}
  46. }
  47. if(!fl)ans++;
  48. memcpy(num,tp2,sizeof tp2);
  49. }
  50. }
  51. printf("%d\n",ans);
  52. }
  53. return ;
  54. }

60分

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

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

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

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

代码如下:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. using namespace std;
  6. int const maxn=,maxm=1e4+;
  7. int T,K,f[maxn][maxn],pri[]={,,,,,,,},num[],t1[];
  8. int n[maxm],m[maxm],mxn,mxm,s[maxn][];
  9. int rd()
  10. {
  11. int ret=,f=; char ch=getchar();
  12. while(ch<''||ch>''){if(ch=='-')f=-; ch=getchar();}
  13. while(ch>=''&&ch<='')ret=(ret<<)+(ret<<)+ch-'',ch=getchar();
  14. return ret*f;
  15. }
  16. void get(int x,int t[],int val)//x
  17. {
  18. for(int i=;i<&&pri[i]<=x;i++)
  19. {
  20. if(x==||x==)return;
  21. while(x%pri[i]==)x/=pri[i],t[i]+=val;
  22. }
  23. }
  24. void getx(int x,int t[],int val)//x!
  25. {
  26. int tmp=x;
  27. for(int i=;i<;i++)
  28. {
  29. x=tmp;
  30. while(x)t[i]+=(x/pri[i])*val,x/=pri[i];
  31. }
  32. }
  33. int work(int x,int y)
  34. {
  35. memset(t1,,sizeof t1);
  36. for(int i=;i<;i++)
  37. {
  38. t1[i]=s[x][i]-s[y][i]-s[x-y][i];
  39. if(t1[i]<num[i])return ;
  40. }
  41. return ;
  42. }
  43. void init()
  44. {
  45. get(K,num,);
  46. for(int i=;i<=mxn;i++)
  47. {
  48. memset(t1,,sizeof t1);
  49. getx(i,t1,); memcpy(s[i],t1,sizeof t1);//阶乘质因子也预处理!
  50. }
  51. for(int i=;i<=mxn;i++)
  52. {
  53. for(int j=;j<=mxm&&j<i;j++)
  54. f[i][j]=f[i-][j]+f[i][j-]-f[i-][j-]+work(i,j);
  55. for(int j=i;j<=mxm;j++)f[i][j]=f[i][j-];
  56. }
  57. }
  58. int main()
  59. {
  60. T=rd(); K=rd();
  61. for(int i=;i<=T;i++)
  62. {
  63. n[i]=rd(); m[i]=rd();
  64. mxn=max(mxn,n[i]); mxm=max(mxm,m[i]);
  65. }
  66. init();
  67. for(int i=;i<=T;i++)printf("%d\n",f[n[i]][m[i]]);
  68. return ;
  69. }

洛谷 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. Android四大核心组件之Activity

    一.活动生命周期 二.生命周期执行介绍 当该页面(Activity)被启动时 会执行onCreate().onStart().onRestart()这三个方法, 只有当onRestart() 方法执行 ...

  2. android 如何从activity跳转到另一个activity下指定的fragment

    思路: 跳转到目标fragment所在的activity,并传递一个flag,来确定要到哪个fragment,根据该flag判断后,跳转到指定的fragment即可. 代码: 当前界面: intent ...

  3. UVa 12333 - Revenge of Fibonacci manweifc(模拟加法竖式 & 字典树)

    题意: 给定n个(n<=40)数字, 求100000个以内有没有前面n个数字符合给定的数字的fibonacci项, 如果有, 给出最小的fibonacci项, 如果没有, 输出-1. 分析: 可 ...

  4. 技能CD 效果 shader

    技能CD特效 这个效果主要是利用反正切函数完成.atan2(x,y)的返回值是[-PI,PI],这个支持4个象限的反正切函数.关于圆角计算,在上篇文章中有介绍. 现在,我们来看看反正切函数的效果: 在 ...

  5. ASP.NET MVC的帮助类HtmlHelper和UrlHelper

    在ASP.NET MVC框架中没有了自己的控件,页面显示完全就回到了写html代码的年代.还好在asp.net mvc框架中也有自带的HtmlHelper和UrlHelper两个帮助类.另外在MvcC ...

  6. Webdriver测试脚本1(打开网页并打印标题)

    案例: 启动火狐浏览器 首页打开博客园页面,打印网页标题,等待3秒 打开百度首页,打印网页标题,再等待2秒 关闭浏览器 from selenium import webdriver from time ...

  7. 九度oj 题目1490:字符串链接

    题目1490:字符串链接 时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:2610 解决:1321 题目描述: 不用strcat 函数,自己编写一个字符串链接函数MyStrcat(char ...

  8. 添物零基础到架构师(基础篇) - JavaScript

    JavaScript是什么? JavaScript是web开发必须学习的,ECMAScript是其规则来源. JavaScript的历史 Developed by Brendan Eich of Ne ...

  9. [K/3Cloud] 创建一个业务单据表单插件

    概念 创建一个业务单据插件,处理单据的相关控制逻辑. 示例 新建一个类,继承自单据插件基类Kingdee.BOS.Core.Bill.PlugIn.AbstractBillPlugIn. using ...

  10. 家的范围 Home on the Range(洛谷 2733)

    题目背景 农民约翰在一片边长是N (2 <= N <= 250)英里的正方形牧场上放牧他的奶牛.(因为一些原因,他的奶牛只在正方形的牧场上吃草.)遗憾的是,他的奶牛已经毁坏一些土地.( 一 ...