2016.1.27

试题描述

杨辉三角是形如如下的数字三角形:

1

1    1

1   2    1

……

现在想求出杨辉三角第N行的N个数中,有多少个数能被给定的质数p整除。

输入
一行两个空格隔开的整数N和p
输出
输出一个整数,表示第N行能被给定的质数p整除的个数
输入示例
3 2
输出示例
1
其他说明
对于60%的数据,N≤30,p≤1000,对于80%的数据,N≤1000,p≤1000,对于100%的数据,N≤〖10〗^9,p≤1000

首先知道是卢卡斯定理 和 组合数取模

然后就一个一个试呗

  1. #include<iostream>
  2. using namespace std;
  3. int a[],e,ans;
  4. int main()
  5. {
  6. int n,p,b,ct;
  7. scanf("%d%d",&n,&p);
  8. b=n-=;
  9. while(b)
  10. {
  11. a[++e]=b%p;
  12. b/=p;
  13. }
  14. for(int i=;i<=n;i++)
  15. {
  16. b=i;ct=;
  17. while(b)
  18. {
  19. if(b%p>a[ct]) {ans+=;break;}
  20. else {ct++;b/=p;}
  21. }
  22. }
  23. printf("%d",ans);
  24. }

然后果断TLE

然后根据杨辉三角的对称性,砍一半

  1. #include<iostream>
  2. using namespace std;
  3. int a[],e,ans;
  4. int main()
  5. {
  6. int n,p,b,ct;
  7. scanf("%d%d",&n,&p);
  8. b=n-=;
  9. while(b)
  10. {
  11. a[++e]=b%p;
  12. b/=p;
  13. }
  14. for(int i=;i<(n+)/;i++)
  15. {
  16. b=i;ct=;
  17. while(b)
  18. {
  19. if(b%p>a[ct]) {ans+=;break;}
  20. else {ct++;b/=p;}
  21. }
  22. }
  23. ans*=;
  24. if(n+&)
  25. {
  26. b=n/;ct=;
  27. while(b)
  28. {
  29. if(b%p>a[ct]) {ans+=;break;}
  30. else {ct++;b/=p;}
  31. }
  32. }
  33. printf("%d",ans);
  34. }

然并卵,依旧TLE

于是机智的我想到了构造

还想到了状态压缩

就是二进制某一位为1表示构造的数在p进制下该位上比n在对应位上大

  1. #include<iostream>
  2. using namespace std;
  3. int a[],e,ans;
  4. int main()
  5. {
  6. int n,p,b,ct;
  7. scanf("%d%d",&n,&p);
  8. b=n-=;
  9. while(b)
  10. {
  11. a[++e]=b%p;
  12. b/=p;
  13. }
  14. for(int t = e- ; t >= ; t-- )
  15. {
  16. for(int i = ( << t ) - ; i >= ; i-- )
  17. {
  18. b=i;ct=a[t+];
  19. for(int j = t- ; j >= ; j-- )
  20. {
  21. if(<<j&b) ct*=p--a[j+];
  22. else ct*=a[j+]+;
  23. }
  24. ans+=ct;
  25. }
  26. }
  27. printf("%d",ans);
  28. }

AC后激动的我瞬间觉得我有做神犇的潜质

但我发现其他人的代码都特短。。。

我方了

冷静后,发现我傻*了

明明可以反着算。。。要知道根据卢卡斯定理构造模p不等于0的数有多简单。。。

看了代码瞬间就懂的

AC代码:

  1. #include<iostream>
  2. using namespace std;
  3. int e,ans=;
  4. int main()
  5. {
  6. int n,p,b;
  7. scanf("%d%d",&n,&p);
  8. b=n-;
  9. while(b)
  10. {
  11. ans*=b%p+;
  12. b/=p;
  13. }
  14. printf("%d",n-ans);
  15. }

HDNOIP201405杨辉三角的更多相关文章

  1. [LeetCode] Pascal's Triangle II 杨辉三角之二

    Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3,Return [1,3, ...

  2. [LeetCode] Pascal's Triangle 杨辉三角

    Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5,Retur ...

  3. POJ2167Irrelevant Elements[唯一分解定理 组合数 杨辉三角]

    Irrelevant Elements Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 2407   Accepted: 59 ...

  4. python生成器实现杨辉三角

    def triangels(): """ 杨辉三角 """ lst = [1] n_count = 2 # 下一行列表长度 while Tr ...

  5. python 生成器生成杨辉三角

    用Python写趣味程序感觉屌屌的,停不下来 #生成器生成展示杨辉三角 #原理是在一个2维数组里展示杨辉三角,空的地方用0,输出时,转化为' ' def yang(line): n,leng=0,2* ...

  6. Java的二维数组的应用及杨辉三角的编写

    (1) 编写一个程序,生成一个10*10的二维随机整数数组,并将该数组的每行最大值保存于一个一维数组中,将每列平均值保存于另外一个一维数组中并分别输出. (2) 编程输出杨辉三角的前10行. 找出一个 ...

  7. POJ3187Backward Digit Sums[杨辉三角]

    Backward Digit Sums Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6350   Accepted: 36 ...

  8. 杨辉三角用java实现

    代码如下: public class ErArray { public static void main(String[] args) { //杨辉三角 int[][] num = new int[1 ...

  9. python 杨辉三角

    前提:端点的数为1. 每个数等于它上方两数之和. 每行数字左右对称,由1开始逐渐变大. 第n行的数字有n项. 第n行数字和为2n-1. 第n行的m个数可表示为 C(n-1,m-1),即为从n-1个不同 ...

随机推荐

  1. debain 8安装为知笔记(how to install wiznote in debain 8)

    刚装了debain8后想安装为知笔记,百度之后发现为知笔记原来是开源软件.代码托管在github上:https://github.com/WizTeam/WizQTClient 但是上面只有Ubunt ...

  2. myeclipse里的调试快捷键

    好多时候在调试代码时,有的时候只会用F5,其他的快捷键却一概不知.今天百度查了一下其他快捷键调试的作用,总结如下 F5 (setp into ): 跳入当前执行的方法中 F6 (step over): ...

  3. 最短路径问题——floyd算法

    floyd算法和之前讲的bellman算法.dijkstra算法最大的不同在于它所处理的终于不再是单源问题了,floyd可以解决任何点到点之间的最短路径问题,个人觉得floyd是最简单最好用的一种算法 ...

  4. C堆栈入门

    原文:http://student.csdn.net/link.php?url=http://www.top-e.org%2Fjiaoshi%2Fhtml%2F427.html 格式和部分内容稍作修改 ...

  5. win32 wndproc 返回值

    LRESULT CALLBACK WndProc(...) { case WM_CREATE: .... return 0; case WM_DESTROY: PostQuitMessage (0) ...

  6. NLP概述

    1,词法分析 待续 2,文本分类 文本表示: 重点是贝叶斯模型:二项表示法和多项表示法.(向量维度为词库大小,一个是01,一个是频次).模型重点在于化后验为先验. 还有其他模型:机器学习模型,分布式模 ...

  7. Kindle Unlimited上的技术书籍

            直达链接:Kindle Unlimited         前不久,亚马逊在中国也推出了电子书包月服务.消息不灵通的我过了好久才看到这个消息,随后第一时间上官网查看具体情况.      ...

  8. T24基础-基本命令(1)

    如果你不知道什么是T24,那这篇文章对你意义不大.如果你所在银行IT刚好就准备使用或已经使用T24作为银行核心系统,那我的文章对你会很有帮助. 1. LIST  这个语句相当于SQL里的“select ...

  9. 用Join子句进行分组联接

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  10. NIO NIO.2

    An NIO.2 primer, Part 1: The asynchronous channel APIs http://blog.arganzheng.me/posts/java-network- ...