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

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

然后就一个一个试呗

#include<iostream>
using namespace std;
int a[],e,ans;
int main()
{
int n,p,b,ct;
scanf("%d%d",&n,&p);
b=n-=;
while(b)
{
a[++e]=b%p;
b/=p;
}
for(int i=;i<=n;i++)
{
b=i;ct=;
while(b)
{
if(b%p>a[ct]) {ans+=;break;}
else {ct++;b/=p;}
}
}
printf("%d",ans);
}

然后果断TLE

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

#include<iostream>
using namespace std;
int a[],e,ans;
int main()
{
int n,p,b,ct;
scanf("%d%d",&n,&p);
b=n-=;
while(b)
{
a[++e]=b%p;
b/=p;
}
for(int i=;i<(n+)/;i++)
{
b=i;ct=;
while(b)
{
if(b%p>a[ct]) {ans+=;break;}
else {ct++;b/=p;}
}
}
ans*=;
if(n+&)
{
b=n/;ct=;
while(b)
{
if(b%p>a[ct]) {ans+=;break;}
else {ct++;b/=p;}
}
}
printf("%d",ans);
}

然并卵,依旧TLE

于是机智的我想到了构造

还想到了状态压缩

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

#include<iostream>
using namespace std;
int a[],e,ans;
int main()
{
int n,p,b,ct;
scanf("%d%d",&n,&p);
b=n-=;
while(b)
{
a[++e]=b%p;
b/=p;
}
for(int t = e- ; t >= ; t-- )
{
for(int i = ( << t ) - ; i >= ; i-- )
{
b=i;ct=a[t+];
for(int j = t- ; j >= ; j-- )
{
if(<<j&b) ct*=p--a[j+];
else ct*=a[j+]+;
}
ans+=ct;
}
}
printf("%d",ans);
}

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

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

我方了

冷静后,发现我傻*了

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

看了代码瞬间就懂的

AC代码:

#include<iostream>
using namespace std;
int e,ans=;
int main()
{
int n,p,b;
scanf("%d%d",&n,&p);
b=n-;
while(b)
{
ans*=b%p+;
b/=p;
}
printf("%d",n-ans);
}

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. 2017 年值得一瞥的 JavaScript 相关技术趋势

    跨年前两天,Dan Abramov在Twitter上提了一个问题: JS社区毫不犹豫的抛出了它们对于新技术的预期与期待,本文内容也是总结自Twitter的回复,按照流行度降序排列.有一个尚未确定的小点 ...

  2. serialVersionUID的作用

    Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的.在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体(类)的seri ...

  3. android 图片浏览器

    自定义了gallary和ImageView: gallary: public class MyGallery extends Gallery { /**  * GestureDetector类 在on ...

  4. linux文件目录权限详解(20170101)

    linux目录权限与文件权限是不同的,二者要相互配合,这是基础. 比如要读文件:目录至少要有x,文件至少要有r. 要写文件:目录至少要有x,文件至少要有rw. 要执行文件:目录至少要有x,文件至少要有 ...

  5. python的or操作符连接多个字符串含义是什么?

    研究odoo代码的时候发现其中有一行语句让人费解 self.rcfile = os.path.abspath( self.config_file or opt.config or os.environ ...

  6. Monkey工具使用详解

    上节中介绍了Monkey工具使用环境的搭建,传送门..本节我将详细介绍Monkey工具的使用. 一.Monkey测试简介 Monkey测试是Android平台自动化的一种手段,通过Monkey程序模拟 ...

  7. C语言字符串操作总结大全(超详细)

    本篇文章是对C语言字符串操作进行了详细的总结分析,需要的朋友参考下 1)字符串操作  strcpy(p, p1) 复制字符串  strncpy(p, p1, n) 复制指定长度字符串  strcat( ...

  8. php7 编译安装 apache

    http://blog.csdn.net/21aspnet/article/details/47708763 根据此教程的步骤但是碰到了若干问题 1.  执行./configure的时候报错 大部分可 ...

  9. 安装恢复Windows10各种坑

    1.安装Windows10最好用微软原装ISO,其它的第三方坑比较多,要么不支持UEFI,要么不支持MBR,要么不支持GPT. 2.恢复系统可以使用WIM备份,或Window原生备份,或者Ghost备 ...

  10. Vigenère密码

    来源  NOIP2012复赛 提高组 第一题 描述 16世纪法国外交家Blaise de Vigenère设计了一种多表密码加密算法--Vigenère密码.Vigenère密码的加密解密算法简单易用 ...