杨辉三角 x
杨辉三角是美丽的数学结晶,其结论往往多蕴含自然之美.
——以下内容均摘抄自题解.
例题:
正如这题所示,数据在n<=10^15的范围内则引导我们去寻找空间更节省,速率更高效的算法。
首先,很明显,杨辉三角之特点在于其行数即等于每行的数字数。因此,可以很容易使用求和公式求出1到n行一共有多少个数字。
其次,通过观察,可以发现,奇数个数比偶数个数更有规律,其规律在于:
每行奇数个数一定为2^k(k为自然数)
当行数恰为2^k(k为自然数)时,奇数个数为2^k,偶数个数为零
当行数恰为2^k(k为自然数)时,奇数个数和恰为3^(k-1)
- 更巧妙的是:这个规律能更加扩展到一个不为2^k的数上,因为每一个数,都能分解为若干项2^k的和的形式。
举个例子吧:当n=2333;
2333= 2048+256+16+8+4+1
通过暴力程序,我们可以找出2333的所有奇数个数为190985
那么,我们找出如下数字
行数 所有奇数个数
2048 177147
256 6561
16 81
8 27 4 9 1 1
我们可以巧妙发现:177147 + 6561*2 + 81*4 + 27*8 + 9*16 + 1*32恰好等于190985!
那么,通过以上的探索,我们就能通过对n的分解,求出奇数总个数。
所以,偶数总个数也就不难得出了。
这样,我们就将一个看起来很困难的大量数求和,降级为极具规律性的数学公式求法。问题也顺理成章转化为如何将一个数分解为若干项2^k的和的形式。通过分析,我们知道算法的复杂度是O(logn)级的,足够通过所有的数据。
这道题目构思精巧,逻辑严密,能够告诉我们规律的寻找是一个漫长的探索过程,但是一旦得出了规律,世间万物自然水落石出!这个算法的正确性能够通过数学证明的,此处不赘述。
- 不要忘了膜题目要求的数字哦!
下面附探索规律的表格:
首先找规律什么的....(除了这个,其实也不一定对~~~~)
/*
前 前 前 前
每 i i 每 i i
排 排 排 排 排 排
偶 偶 偶 奇 奇 奇
数 数 数 数 数 数
个 个 和 个 个 和
*/
1 0 0 0 1 1 1
1 1 0 0 0 2 3 3
1 2 1 1 1 2 2 5 5
1 3 3 1 0 1 2 4 9 7
1 4 6 4 1 3 4 16 2 11 9
1 5 10 10 5 1 2 6 26 4 15 21
1 6 15 20 15 6 1 3 9 58 4 19 53
1 7 21 35 35 21 7 1 0 9 58 8 27 128
1 8 28 56 70 56 28 8 1 7 16 254 2 29 130
1 9 36 84 126 126 84 36 9 1 6 22 746 4 33 150
......
大佬给出的:
// 行数 该行奇数 奇数和 偶数 偶数和 总数
1 1 1 0 0 1
2 ( 2) 3 0 0 3
3 ( 2) 5 1 1 6
4 ( 4) 9 0 1 10
5 ( 2) 11 3 4 15
6 ( 4) 15 2 6 21
7 ( 4) 19 3 9 28
8 ( 8) 27 0 9 36
9 ( 2) 29 7 16 45
10 ( 4) 33 6 22 55
16 ( 16) 81 0 55 136
32 ( 32) 243 0 285 528
64 ( 64) 729 0 1351 2080
128 (128) 2187 0 6069 8256
256 (256) 6561 0 26335 32896
512 (512) 19683 0 111645 131328
1024 (1024) 59049 0 465751 524800
2048 (2048) 177147 0 1921029 2098176
4096 (4096) 531441 0 7859215 8390656
下面附探索规律的辅助程序:
#include <cstdio>
using namespace std; int t, i, j, ou, line, e, tot;
int mp[][];
int judge(int x)
{
int v=;
while (v<x)
{
v *=;
}
if (v==x) return ;
else return ;
}
int main()
{// Input an integer in 10000!
scanf("%d",&e);
mp[][]=;
ou = line = ;
tot = ;
//行数(该行总数) 该行奇数 所有奇数 该行偶数 所有偶数 总数
printf(" 1 1 1 0 0 1\n");
for (i=; i<=e; ++i)
{
line=;
for (j=; j<=i; ++j)
{
mp[i][j]=mp[i-][j-]+mp[i-][j];
if (mp[i][j]%==) ++line;
}
ou += line;
tot += i;
if (judge(i)==)//保留该行可只查看N=2^k(k为自然数)的结果,若省略则查看所有结果
printf("%5d %5d %5d %5d %5d %5d\n", i, i-line, tot-ou, line, ou, tot);
}
return ;
}
附参考主程序:
#include <cstdio>
#define mo 1000003
using namespace std; long long n, d, z, ans, a[], b[], v, p;
int i, t;
int main()
{
scanf("%lld",&v);
n = v;
z = ;
d = z << ; //因为2^50恰好大于10^15
t = ;
while (n != )
{
if (n >= d)
{
n = n-d;
a[++a[]] = t; //将2^t 的t存入数组中
}
d /= ;
t--;
} b[] = ;
for (i=; i<=a[]; ++i)
b[i]=(b[i-]*)%mo; //进行预处理,准备好3^t 的数字在数组b中 for (i=; i<=a[]; ++i)
ans += b[a[i]]*(long long)(z << i-); //求所有奇数个数的和 p = (((z+v%mo)*(v%mo))/); //求和公式
p %= mo;
ans %= mo;
if (p<ans) p += mo;
p = (p-ans)%mo; //总个数减去所有奇数个数就是偶数个数了
printf("%lld\n",p);
return ;
}
杨辉三角 x的更多相关文章
- [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* ...
- HDNOIP201405杨辉三角
2016.1.27 试题描述 杨辉三角是形如如下的数字三角形: 1 1 1 1 2 1 …… 现在想求出杨辉三角第N行的N个数中,有多少个数能被给定的质数p整除. 输入 一行两个空格隔 ...
- 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个不同 ...
随机推荐
- python 并发编程 非阻塞IO模型
非阻塞IO(non-blocking IO) Linux下,可以通过设置socket使其变为non-blocking.当对一个non-blocking socket执行读操作时,流程是这个样子: 从图 ...
- 索引之----mysql单列索引失效的情况
使用的索引名称: 1.隐式转换导致索引失效. 由于表字段定义为vachar类型,但在查询时把该字段作为number类型 以及where条件传给mysql. 2.对索引列进行任何操作(计算(+.-.*. ...
- 洛谷 P3368 树状数组 题解
题面 本题随便看两眼就知道该题满足了优美的查分性质: 对于在区间[x,y]内操作时,应该将查分数组的第x项和第y+1项进行相反操作: 询问答案时,问第i个数的值就是查分数组的前i项和: 暴力+玄学卡常 ...
- Dango之初识安装
1. MVC和MTV框架 1.1MVC Web服务器开发领域里著名的MVC模式 所谓MVC就是把Web应用分为模型(M), 控制器(C)和视图(V)三层,他们之间以一种插件式的.松耦合的方式连接在一起 ...
- 2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛 H. Skiing
题意:在这个寒假中,鲍勃有计划在山区度假胜地滑雪.这个滑雪胜地有M个不同的滑雪道和N个不同的标志位于那些转弯处点.从第S标记到第T标志的第i路径具有长度L.每个路径必须遵循降低高度的原则,起点必须严格 ...
- php中use关键词使用场景
php中use关键词使用场景,主要使用在函数内部使用外包得变量才使用得 1,这种函数使用不到外包变量 $messge="96net.com.cn"; $exam=function ...
- 2015 四川省赛 C Censor(哈希 | KMP)
模式串为子串 KMP /* @author : victor */ #include <bits/stdc++.h> using namespace std; typedef long l ...
- 05、解剖CEL文件各版本格式和读取方法(非R语言)
相比DAT文件,网络上更支持CEL级别的文件.CEL已经把DAT图像转换成数据了,而且CEL比DAT所占空间小得多.介绍一下CEL文件的格式,CEL文件有文本文件(TextCelFile,版本3).B ...
- vlang
参考 V语言中文教程 - 基础部分
- SSH自动登录config文件配置
title: SSH自动登录config文件配置 comments: false date: 2019-08-19 19:29:13 description: 更方便的 ssh 操作??? categ ...