洛谷 P2529 [SHOI2001]击鼓传花 解题报告
P2529 [SHOI2001]击鼓传花
题意:求出\(n!\)末尾最后一位非0数字
数据范围:\(n<=10^{100}\)
我们从简单的开始考虑
1.显然,\(n!\)可以被这么表示
\(n!=c \times 2^a \times 5^b\)
显然有\(a>b\)
2.末尾的元素即为\(c \%10 \times 2^{a-b} \%10\)
显然这个复杂度是我们所不能接受的
我们发现\(5\)很特殊
我们把所有\(5\)的倍数都取出来(注意取出的是\(5\)的倍数而不是因数\(5\)),给每个\(5\)配一个\(2\)
相当于把\(5*1,5*2,5*3,...,5*n\)中的\(5\)约去,发现剩下的是一个规模1/5的相同子问题
令\(fac(i)\)表示\(i!\)的末尾非0数字,则有\(fac(i)=fac(\lfloor i/5 \rfloor) \times ? \% 10\)
我们想办法求出\(?\)的贡献
因为因子\(2\)消不完,所以末尾必须是偶数
发现剩下的数可以直接\(mod\) \(10\)了
把每\(20\)位分成一块,对末位的贡献为\(6\)
因为$6 \times $任意偶数,末尾不变
所以答案只需要把20位以内的额外贡献找到就可以
我们考虑直接把这20位打表,然后递归处理子问题
复杂度可以接受(高精度我不会算)
Code:
#include <cstdio>
#include <cstring>
const int N=102;
struct l_num
{
int num[N];
l_num()
{
memset(num,0,sizeof(num));
}
l_num(char c[])
{
memset(num,0,sizeof(num));
num[0]=strlen(c);
for(int i=1;i<=num[0];i++)
num[i]=c[num[0]-i]-'0';
}
l_num friend operator /(l_num n1,int n2)
{
for(int i=n1.num[0];i>1;i--)
{
n1.num[i-1]+=n1.num[i]%n2*10;
n1.num[i]/=n2;
}
n1.num[1]/=n2;
if(!n1.num[n1.num[0]]) --n1.num[0];
return n1;
}
int friend operator %(l_num n1,int n2)
{
return n1.num[0]==1?n1.num[1]:(n1.num[2]&1)*10+n1.num[1];
}
};
int init[21]={1,1,2,6,4,2,2,4,2,8,4,4,8,4,6,8,8,6,8,2,6};
char c[103];
int cal(l_num fac)
{
return fac.num[0]?init[fac%20]*cal(fac/5)%10:1;
}
int main()
{
int t=5;
while(t--)
{
scanf("%s",c);
l_num fac(c);
printf("%d\n",cal(fac));
}
return 0;
}
2018.8.9
洛谷 P2529 [SHOI2001]击鼓传花 解题报告的更多相关文章
- 洛谷 P2527 [SHOI2001]Panda的烦恼 解题报告
P2527 [SHOI2001]Panda的烦恼 题目描述 panda是个数学怪人,他非常喜欢研究跟别人相反的事情.最近他正在研究筛法,众所周知,对一个范围内的整数,经过筛法处理以后,剩下的全部都是质 ...
- 洛谷 P2530 [SHOI2001]化工厂装箱员 解题报告
P2530 [SHOI2001]化工厂装箱员 题目描述 118号工厂是世界唯一秘密提炼锎的化工厂,由于提炼锎的难度非常高,技术不是十分完善,所以工厂生产的锎成品可能会有3种不同的纯度,A:100%,B ...
- 洛谷 P2323 [HNOI2006]公路修建问题 解题报告
P2323 [HNOI2006]公路修建问题 题目描述 输入输出格式 输入格式: 在实际评测时,将只会有m-1行公路 输出格式: 思路: 二分答案 然后把每条能加的大边都加上,然后加小边 但在洛谷的题 ...
- 洛谷 P1852 [国家集训队]跳跳棋 解题报告
P1852 [国家集训队]跳跳棋 题目描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子. 我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在\(a\),\(b\), ...
- 洛谷 P2611 [ZJOI2012]小蓝的好友 解题报告
P2611 [ZJOI2012]小蓝的好友 题目描述 终于到达了这次选拔赛的最后一题,想必你已经厌倦了小蓝和小白的故事,为了回馈各位比赛选手,此题的主角是贯穿这次比赛的关键人物--小蓝的好友. 在帮小 ...
- 洛谷 P2114 [NOI2014]起床困难综合症 解题报告
P2114 [NOI2014]起床困难综合症 题目描述 21世纪,许多人得了一种奇怪的病:起床困难综合症,其临床表现为:起床难,起床后精神不佳.作为一名青春阳光好少年,atm一直坚持与起床困难综合症作 ...
- 洛谷 P3299 [SDOI2013]保护出题人 解题报告
P3299 [SDOI2013]保护出题人 题目描述 出题人铭铭认为给SDOI2012出题太可怕了,因为总要被骂,于是他又给SDOI2013出题了. 参加SDOI2012的小朋友们释放出大量的僵尸,企 ...
- 洛谷 P2059 [JLOI2013]卡牌游戏 解题报告
P2059 [JLOI2013]卡牌游戏 题意 有\(n\)个人玩约瑟夫游戏,有\(m\)张卡,每张卡上有一个正整数,每次庄家有放回的抽一张卡,干掉从庄家起顺时针的第\(k\)个人(计算庄家),干掉的 ...
- 洛谷 P2463 [SDOI2008]Sandy的卡片 解题报告
P2463 [SDOI2008]Sandy的卡片 题意 给\(n(\le 1000)\)串,定义两个串相等为"长度相同,且一个串每个数加某个数与另一个串完全相同",求所有串的最长公 ...
随机推荐
- thinkphp phpmailer邮箱验证
thinkphp 关于phpmailer的邮箱验证 一 . 登陆自己的邮箱,例如:qq邮箱.登陆qq邮箱在账户设置中开启smtp服务: 之后回发送一个授权码 , 这个授权码先保存下来,这个授权码在后 ...
- 学习photoshop心得
简要的学习了ps的三大功能p图,抠图,作图, p图主要是学了换脸这一效果,用到套索工具,把范冰冰的脸接到郭德纲身上, 首先使用套索工具把脸圈起来 然后移动到 另一个人脸上 再然后混合图层,自动混合 差 ...
- python读取大文件和普通文件
读取文件,最常见的方式是: with open('filename', 'r', encoding = 'utf-8') as f: for line in f.readlines(): do_som ...
- Linux命令备忘录:quota显示磁盘已使用的空间与限制
quota命令用于显示用户或者工作组的磁盘配额信息.输出信息包括磁盘使用和配额限制. 语法 quota(选项)(参数) 选项 -g:列出群组的磁盘空间限制: -q:简明列表,只列出超过限制的部分: - ...
- MySQL server has gone away报错原因分析及解决办法
原因1. MySQL 服务宕了 判断是否属于这个原因的方法很简单,执行以下命令,查看mysql的运行时长 $ mysql -uroot -p -e "show global status l ...
- golang的加法比C快?
本文同时发表在https://github.com/zhangyachen/zhangyachen.github.io/issues/142 1.31 晚上的火车回家,在公司还剩两个小时,无心工作,本 ...
- 002---tcp/ip五层详解
tcp/ip 五层模型讲解 越靠底层就越接近硬件,越靠上层越接近用户.先从底层看起,理解整个互联网通信的原理. 物理层(传输电信号) 孤立的计算机想要一起玩.就必须用硬件在计算机之间完成组网.以硬件做 ...
- mybatis-generator自定义注释生成
最近做的项目发现没有中文注释,故查找资料,特此记录. 本文所用的是基于mybatis-generator 1.3.2版本来完成的. mybatis-generator 自动生成的代码注释是很反人类的, ...
- 深度学习(deep learning)优化调参细节(trick)
https://blog.csdn.net/h4565445654/article/details/70477979
- 「暑期训练」「Brute Force」 Optimal Point on a Line (Educational Codeforces Round 16, B)
题意 You are given n points on a line with their coordinates $x_i$. Find the point x so the sum of dis ...