HDNOIP201405杨辉三角
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杨辉三角的更多相关文章
- [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, ...
- [LeetCode] Pascal's Triangle 杨辉三角
Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5,Retur ...
- POJ2167Irrelevant Elements[唯一分解定理 组合数 杨辉三角]
Irrelevant Elements Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 2407 Accepted: 59 ...
- python生成器实现杨辉三角
def triangels(): """ 杨辉三角 """ lst = [1] n_count = 2 # 下一行列表长度 while Tr ...
- python 生成器生成杨辉三角
用Python写趣味程序感觉屌屌的,停不下来 #生成器生成展示杨辉三角 #原理是在一个2维数组里展示杨辉三角,空的地方用0,输出时,转化为' ' def yang(line): n,leng=0,2* ...
- Java的二维数组的应用及杨辉三角的编写
(1) 编写一个程序,生成一个10*10的二维随机整数数组,并将该数组的每行最大值保存于一个一维数组中,将每列平均值保存于另外一个一维数组中并分别输出. (2) 编程输出杨辉三角的前10行. 找出一个 ...
- POJ3187Backward Digit Sums[杨辉三角]
Backward Digit Sums Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6350 Accepted: 36 ...
- 杨辉三角用java实现
代码如下: public class ErArray { public static void main(String[] args) { //杨辉三角 int[][] num = new int[1 ...
- python 杨辉三角
前提:端点的数为1. 每个数等于它上方两数之和. 每行数字左右对称,由1开始逐渐变大. 第n行的数字有n项. 第n行数字和为2n-1. 第n行的m个数可表示为 C(n-1,m-1),即为从n-1个不同 ...
随机推荐
- 在Visual Lisp中处理自动化错误
Handling Automation errors in Visual LISP 翻译自原文Kean's blog:http://through-the-interface.typepad.com/ ...
- 最小生成树——kruskal算法
kruskal和prim都是解决最小生成树问题,都是选取最小边,但kruskal是通过对所有边按从小到大的顺序排过一次序之后,配合并查集实现的.我们取出一条边,判断如果它的始点和终点属于同一棵树,那么 ...
- tableView优化性能
在iOS应用中,UITableView应该是使用率最高的视图之一了.iPod.时钟.日历.备忘录.Mail.天气.照片.电话.短信. Safari.App Store.iTunes.Game Cent ...
- js 字符串转换成数字的三种方法
在js读取文本框或者其它表单数据的时候获得的值是字符串类型的,例如两个文本框a和b,如果获得a的value值为11,b的value值为9 ,那么a.value要小于b.value,因为他们都是字符串形 ...
- 自己瞎捣腾的Win7下Linux安装之路-----图例篇
写在前面 网上很多这方面的教程,我也是参考他们的文章和一些书籍才弄成功.没啥创新性,只为记录下来,以供自已理解和以后复习. 所谓工欲善其事,必先利其器.俺想学习Linux,当然是要先装一个Linux( ...
- equals与==的区别
equals与==的区别. 下面是equals的源码 public boolean equals(Object anObject) { if (this == anObject) { //如果两个对象 ...
- 【jq】c#零基础学习之路(1)Hello World!
从今天起我会持续发表,这个就是一个日记型的,学习编程是枯燥的,况且我们还是零基础. 学前准备 1.编译环境 vs2010.vs2012.vs2015...(本人用的是vs2010旗舰版).vs2010 ...
- Struts2中通过超链接传参数要注意的问题
写到分页的功能,在传递页码pageNo的时候遇到了参数接收不正确的问题,我本来在action中是定义了一个pageNo字符串参数和一个Page类参数,Page是一个封装了页面要显示的数据集合和页面信息 ...
- 命令模式(Command Pattern)
命令模式的本质是对命令进行封装,将发出命令的责任和执行命令的责任分割开.命令模式是为了解决命令的请求者和命令的实现者之间的耦合关系. 将来自客户端的请求传入一个对象,从而使你可用不同的请求对客户进行参 ...
- SSL/TLS算法流程解析
SSL/TLS 早已不是陌生的词汇,然而其原理及细则却不是太容易记住.本文将试图通过一些简单图示呈现其流程原理,希望读者有所收获. 一.相关版本 Version Source Description ...