POJ 1150 The Last Non-zero Digit 数论+容斥

POJ 1150 The Last Non-zero Digit 数论+容斥

题目地址: 
POJ 1150

题意: 
求排列P(n, m)后面第一个非0的数。

分析

为了熟悉题目中的理论。我先做了俩0基础的题目: 
POJ 1401。题解见:POJ 1401 && ZOJ 2202 Factorial 阶乘N!的末尾零的个数 
NYOJ 954。题解见:NYOJ 954 求N!二进制末尾几个0

这题想了一下。十进制末尾几个0能够转化为几个5因子。二进制最后一位非0能够转化为2因子。可是10进制就不行了,并且这个不是单单N!。而是n!/m!。orz。 
实在太弱仅仅能研究题解,推荐SCAU_Lyon巨巨的题解abilitytao巨巨的题解

然后我坐在电脑前面看了一晚上题解,最终。我发现我太弱了,我好不easy有点看懂了。

大概讲一下吧。 
我们要把排列转化成前面两题的形式。 
P(n, m) = n!/(n-m)!,我们让m = n - m直接按n!/m!做,也就是求m(m+1)(m+2)....n了。 
这时候,我们仅仅要统计在[m, n]这个范围里面的数的最后一位即可了,假设直接去暴力会跪。
由于我们不仅要统计每一个数的最后一位,另一些2和5因子混在数中,我们还要消掉那些因子,然后取末位。

 
于是要把2和5抽出来,然后就仅仅剩3,7,9,统计抽完后的3,7,9,然后还得记得:由于这里面2可能会比5多,所以要把多出来的2算出来。

仅仅要知道怎样统计n!,就能统计排列。 
个中计算有非常厉害的技巧,表示orz。

一、计算n!中消除2,5后末位为x的公式为: 
f(n, x) = n/10 + (n%10>=x) + f(n/2, x) + f(n/2, 5) - f(n/10, x). 
解释下: 
1. x限定3,7,9。 
2. n/10 + (n%10>=x)也就是:每十个数以内末数字是3,7,9在没有除去2和5两种因子前都仅仅会出现一次。 
3. 加上抽出2和5后的子问题。(这里跟前面两题原理一样) 
4. 抽出2和5的时候,会多抽出了一次10,这时候就要用容斥定理减去。

二、然后计算多余的2就比較easy理解了。就跟前面俩题一样。求出2的个数和5的个数。减一下就是n!中多出来的2的个数了。

三、然后我们就能得到[m,n]中抽出2,5后末位为3,7,9的个数,以及多出来的2的个数了。

 
这时候假设直接while(cnt--)去算可能会超时+爆范围。 
我们能够发现2^n,3^n,7^n,9^n的末位都是有规律可寻的。于是就能直接算了。

具体细节见代码。

代码

/*
*  Author:      illuz <iilluzen[at]gmail.com>
*  File:        1150.cpp
*  Create Date: 2014-05-26 22:28:45
*  Descripton:  
*/#include <cstdio>
#include <cstring>const int N = 2e5;int cnt3, cnt7, cnt9, cnt2;
int n, m;
int rec[10][N];// 计算n!中消除2,5后末位为x的数量
int f(int n, int k) {if (n < 1)return 0;if (n < N && rec[k][n] != -1)return rec[k][n];int ret = n / 10 + (n % 10 >= k) + f(n / 2, k) + f(n / 5, k) - f(n / 10, k);if (n < N)rec[k][n] = ret;return ret;
}// 多出来的2的个数
int more(int n) {int num2 = 0, num5 = 0;int t = n;while (t != 0) {num2 += t / 2;t /= 2;}while (n != 0) {num5 += n / 5;n /= 5;}return num2 - num5;
}int main()
{memset(rec, -1, sizeof(rec));while (~scanf("%d%d", &n, &m)) {if (m == 0) {puts("1");continue;}m = n - m;cnt2 = more(n) - more(m);cnt3 = f(n, 3) - f(m, 3);cnt7 = f(n, 7) - f(m, 7);cnt9 = f(n, 9) - f(m, 9);// printf("%d %d %d %d\n", cnt2, cnt3, cnt7, cnt9);// 2 4 8 6if (cnt2-- == 0)cnt2 = 1;else if (cnt2 % 4 == 0)cnt2 = 2;else if (cnt2 % 4 == 1)cnt2 = 4;else if (cnt2 % 4 == 2)cnt2 = 8;elsecnt2 = 6;// 1 3 9 7if (cnt3 % 4 == 0)cnt3 = 1;else if (cnt3 % 4 == 1)cnt3 = 3;else if (cnt3 % 4 == 2) cnt3 = 9;elsecnt3 = 7;// 1 7 9 3if (cnt7 % 4 == 0)cnt7 = 1;else if (cnt7 % 4 == 1)cnt7 = 7;else if (cnt7 % 4 == 2)cnt7 = 9;elsecnt7 = 3;// 1 9if (cnt9 % 2 == 0)cnt9 = 1;elsecnt9 = 9;printf("%d\n", cnt2 * cnt3 * cnt7 * cnt9 % 10);}return 0;
}


转载于:https://www.cnblogs.com/ldxsuanfa/p/10481394.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/264643.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

redis mysql原理_MYSQL MONGODB REDIS 同步原理以及高可用性对比

MySQL1、异步复制&#xff1a;2、半同步复制&#xff1a;同步出现超时后会自动变回异步复制&#xff1b;MongoDBMongoDB的副本集是一组mongod进程的集合&#xff0c;提供冗余和高可用性。最小的的副本集包含(1个primary、1个secondary和1个arbiter)&#xff0c;大多数的部署包含…

使用JSON JavaScriptSerializer 进行序列化或反序列化时出错。字符串的长度超过了为 maxJsonLength属性...

<system.web.extensions><scripting><webServices><jsonSerialization maxJsonLength"1024000" /></webServices></scripting> </system.web.extensions> 使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错。字…

XML数据岛(XML Data Island)(只适用于ie)

< DOCTYPE html PUBLIC -WCDTD XHTML StrictEN httpwwwworgTRxhtmlDTDxhtml-strictdtd> 在Microsoft Internet Explorer 5.0及以后的版本里里&#xff0c;你可以利用XML元素来创建数据岛&#xff0c;数据岛就是被HTML页面引用或包含的XML数据&#xff0c;XML数据可以包含…

并不对劲的bzoj3994:loj2185:p3327[SDOI2015]约数个数和

题目大意 设d(x)为x的约数个数&#xff0c;\(t\)组询问&#xff0c;给定\(n,m\)(\(t,m,n\leq5*10^4\))&#xff0c;求$ \sum^n_{i1}\sum^m_{j1}d(i*j)$ 题解 假设\(n\leq m\) 设\(ip_1^{a_1}*p_2^{a_2}*...*p_k^{a_k},jp_1^{b_1}*p_2^{b_2}*...*p_k^{b_k}\) 对于\(i*j\)的某个约…

mysql redo原子写_InnoDB如何保证redolog的完整性?

redo log里记录的只是对数据库页面的更改&#xff0c;它记录着类似『更改页面x 的指定偏移量的数据为k』这样的信息&#xff0c;是完全二进制的log(数据库原理概念上的&#xff0c;不是指MySQL binlog&#xff0c;MySQL binlog不是二进制log)&#xff1b;在redo log里并没有存储…

ArcGIS 9.2 Server Pack 5 蓄势待发

ArcGIS 9.2补丁真是不少&#xff0c;快把开发人员给淹没了&#xff0c;之前版本的ArcGIS从来没有发布过sp4&#xff0c;现在已经通知马上要发布sp5&#xff0c;修正了大量desktop、engine、server上的bug&#xff0c;估计这应该是9.2最后一组补丁了&#xff0c;记得上次Jack来北…

jenkins maven没有使用全局设置文件地址_Jenkins手把手图文教程「基于Jenkins 2.164.1」...

一、下载前往https://jenkins.io/download/ &#xff0c;按需下载。如用于生产&#xff0c;建议下载Long-term Support (LTS) 版本&#xff0c;这样能够获得相对长期的维护&#xff1b;如想体验最新的功能&#xff0c;可尝试 Weekly 版本。可以直接下载特定系统专属的版本&…

游戏数值策划-经验值计算公式设计(自百度文库)

较复杂的概念源自于设计师对游戏整体的把握&#xff0c;例如我们在设计游戏中主角的成长经验值时&#xff0c;并不能随意给出个公式就了事&#xff0c;那是毫不负责任的。 经验计算的基础模型 我们通常说的成长所需经验公式大多是&#xff1a; 每级升级所需经验Lv^3*修正值修正…

[原创]flex 3 + .net开发flash Remoting一 --- 开发环境

flex 3 .net开发flash Remoting一 --- 开发环境 本篇文章将介绍flash Remoting 开发的必备的运行环境和相关配置过程&#xff1a;一。开发必备环境。 1. flex 3&#xff0c;请从Adobe官方网站下载或其它地方找D版(目前为止D版还没有出)。 2. Visual Studio 2005&#…

【转】winform回车变为tab

源地址&#xff1a;http://www.cnblogs.com/wohexiaocai/p/4302200.html转载于:https://www.cnblogs.com/haizine/p/10484454.html

接视频Java 数据库

http://pan.baidu.com/s/1mg1EYAO windows各种版本map.centerAndZoom(point,15);这句话可以指向地图的不同位置百度云http://developer.baidu.com/map/jsdemo.htm#i1_1?qq-pf-topcqq.c2c1 百度云粉丝 http://yun.baidu.com/share/home?uk1814500964&viewshare#categor…

Lachesis Shield 设计上的抉择

最近有很多朋友和同学跟我谈起 Lachesis Shield 设计上的一些问题。我想我需要总结一下我的设计策略&#xff0c;虽然这是个看起来简单得不能再简单的工具。我面临的选择&#xff1a;1 界面位置显然&#xff0c;有很多位置可以摆放这么个不起眼的东西&#xff0c;比如说&#x…

mysql表恢复报错binlog_mysqlbinlog 恢复报错ERROR at line 24826643: Unknown command '\'汗血宝马...

有两个binlog日志文件mysql-bin.000001,mysql-bin.000002&#xff0c;大小都是1G左右。现在要在另外一个库上做完全恢复。想到通常的恢复方法&#xff1a;mysqlbinlog /usr/local/var/mysql1/mysql-bin.000001 | mysql -uroot -S /usr/local/var/mysql2/mysql2.sockmysqlbinlog…

oracle数据库实验讲义-读书笔记(一)

1、激活锁定的用户alter user scott account unlock identified by tiger;2、使用内含脚本建立scott用户%oracle_home%\rdbms\admin\utlsampl.sql3、查看当前用户所有的表select * from tab;4、将屏幕显示输入到文本文件内spool D:1.txtselect * from emp;spool off spool D:1.…

linux分盘笔记

一磁盘分区 首先磁盘分区&#xff1a;计算机中存放信息的主要的存储设备就是硬盘&#xff0c;但是硬盘不能直接使用&#xff0c;必须对硬盘进行分割&#xff0c;分割成的一块一块的硬盘区域就是磁盘分区。在传统的磁盘管理中&#xff0c;将一个硬盘分为两大类分区&#xff1a;主…

sqlite mysql pgsql_比较MySQL,PostgreSQL和SQLite中的数据库列类型?(跨图)

小编典典我会做不同的事情清单&#xff1a;MySQL中的MEDIUMINT是一个奇怪的鸭子(3个字节)。我会避免它&#xff0c;但否则也将其映射到INTEGER。MySQLBOOLEAN(别名BOOL&#xff0c;别名TINYINT(1))与pg布尔类型不兼容。您可能无法移植应用程序&#xff0c;具体取决于它们用作布…

[导入]毕业的日子

出来快一年了&#xff0c;真有点怀念毕业前的那份时光。没有太多的事情可做&#xff0c;整天忙着以后的工作。来往与学校与市区两边。不停的学着新出来的技术&#xff0c;好像也有很多事情要做&#xff0c;想着自己以后会做什么&#xff0c;一点底也没有&#xff0c;虽然是学程…

python 析构函数_常用的python类的魔术方法

对于很少使用python编写大型代码的朋友可能会忘记python还是一种面向对象的语言。在其他面向对象的语言中有构造函数、析构函数等等在生命周期不同时机自动调用的函数&#xff0c;python当然也是有的。除此之外&#xff0c;python类还有很多神奇的编写方式让对象的表现更加丰富…

【linux基础】关于ARM板子使用O3编译选项优化

前言 应领导要求需要将最初级版本的算法移植到ARM板子上&#xff0c;并进行优化&#xff0c;以期达到实时。 平台 移植前&#xff1a; TX2 移植后&#xff1a; ARM() processor : 3 model name : ARMv7 Processor rev 10 (v7l) BogoMIPS : 7.54 Features : swp h…

微软桌面虚拟化vdi 安装测试体验

最近同事在讨论桌面虚拟化&#xff0c;说目前很多企业都准备上桌面虚拟化&#xff0c;结合众多的解决方案&#xff0c;觉得微软的桌面虚拟化方案不错&#xff0c;相对与citrix的xendesktop,vmware view 有一定的价格优势&#xff0c;心里想&#xff0c;微软是大公司&#xff0c…