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个不同 ...
随机推荐
- Android之动态申请权限(API23以上需求)
API 23之前的版本都是自动获取权限,而从 Android 6.0 开始添加了权限申请的需求,更加安全. 这里以单个存储权限为例: · 在 Manifest 中添加访问权限:(只需设置可写,因为可写 ...
- LintCode Subarray Sum
For this problem we need to learn a new trick that if your start sum up all elements in an array. Wh ...
- Spring 的 NamedParameterJdbcTemplate(转)
NamedParameterJdbcTemplate类是基于JdbcTemplate类,并对它进行了封装从而支持命名参数特性. NamedParameterJdbcTemplate主要提供以下三类方法 ...
- 返回顶部demo
<!DOCTYPE html><html lang="en"> <head> <meta charset="UTF-8" ...
- 根据url地址单个或批量下载图片
我们在java开发的时候会遇到通过url地址下载图片的情况.方便起见,我把通过url地址下载图片封装了tool工具类,方便以后使用 1.根据如:http://abc.com/hotels/a.jpg ...
- Ubuntu下安装boost
今天开始安装配置Ubuntu开发环境(Ubuntu 12.04).在干活之前就预计到会遇到很多问题,但是没想到一开始就卡壳,可能是linux中各种包的依赖关系太复杂了,决定写个帖子记录一下,免得以后再 ...
- JSP - 9大内置对象及其API
内置对象:不需要预先声明就可以在脚本代码和表达式中随意使用,有以下特点 1.由JSP规范提供,不用编写者实例化 2.提供Web容器实现和管理 3.所有JSP页面均可用 4.只有在脚本元素的表达式或者代 ...
- JSPatch – 动态更新iOS APP
原文:http://blog.cnbang.net/works/2767/ JSPatch是最近业余做的项目,只需在项目中引入极小的引擎,就可以使用JavaScript调用任何Objective-C的 ...
- 在Windows上运行InfoPi
一.安装Python Python官网的下载页面: https://www.python.org/downloads/ 请下载Python 3.4或以上版本. (Python 3.5已不再支持Win ...
- C#与C/C++的交互
引擎内核用C++为了保证运行速度,程序员可以使用C#来编写其他的业务逻辑,可以使用.NET类库中的绝大多数类,这样来降低开发难度,同时也降低了入门难度,可以吸引更多的.NET程序.