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

POJ 1150 The Last Non-zero Digit 数论+容斥相关推荐

  1. 数学--数论--容斥定理完全解析(转)

    对容斥原理的描述 容斥原理是一种重要的组合数学方法,可以让你求解任意大小的集合,或者计算复合事件的概率. 描述 容斥原理可以描述如下: 要计算几个集合并集的大小,我们要先将所有单个集合的大小计算出来, ...

  2. P2714-四元组统计【数论,容斥】

    正题 题目链接:https://www.luogu.com.cn/problem/P2714 题目大意 给出nnn个数,求有多少个(i,j,k,l)(i,j,k,l)(i,j,k,l)使得gcd(ai ...

  3. P1447-[NOI2010]能量采集【GCD,数论,容斥】

    正题 题目链接:https://www.luogu.org/problemnew/show/P1447 题目大意 求∑i=1n∑j=1mgcd(i,j)∗2−1\sum_{i=1}^n\sum_{j= ...

  4. 【POJ - 1741】Tree(树分治,容斥,点分治,模板题)

    题干: Give a tree with n vertices,each edge has a length(positive integer less than 1001). Define dist ...

  5. [BZOJ3930][CQOI2015]选数(数论+容斥)

    首先,进行如下处理: 1.如果 L L是KK的倍数,那么把 L L变为LK\frac{L}{K},否则变为 ⌊LK⌋+1 \lfloor\frac{L}{K}\rfloor+1. 2.把 H H变成⌊ ...

  6. POJ 1150 The Last Non-zero Digit 《挑战程序设计竞赛》

    为什么80%的码农都做不了架构师?>>>    POJ 1150 The Last Non-zero Digit超大组合数:求超大组合数P(n, m)的最后一个非零位.4.1更加复杂 ...

  7. UVA-10212 The Last Non-zero Digit. 分解质因子+容斥定理

    这个是参考了别人之后的代码,POJ上0MS过了.Orz......对于一个序列在提取了2,5之后,例如1,2,3,4,5,6,7,8,9,10,我们可以将其中的奇数和偶数分开来对待,对于偶数序列2,4 ...

  8. The Last Non-zero Digit POJ - 1150(n!mod p)

    题意: 要求你求出n!(n−m)!)\frac{n!}{(n-m)!)}(n−m)!)n!​中最后一个非0的数字. 题目: In this problem you will be given two ...

  9. POJ 3154 Graveyard【多解,数论,贪心】

    Graveyard Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 1707   Accepted: 860   Specia ...

最新文章

  1. python调用数据集mnist_Python读取MNIST数据集
  2. Ubuntu之make:make命令行工具的简介、安装、使用方法之详细攻略
  3. android cliptopadding java代码_android:clipToPadding属性的分析——以ListView的别样padding为例...
  4. ajax 传递参数中文乱码解决办法
  5. leetcode383. 赎金信
  6. mysql3.5.2 下载_mybatis 3.5.2 jar 下载
  7. 苍溪实验中学计算机等级考试,苍溪实验中学2021年招生录取分数线
  8. Unity 利用FFmpeg实现录屏、直播推流、音频视频格式转换、剪裁等功能
  9. c语言开发实际,21实际c语言教程-1 (转)
  10. 查找功能_苹果查找功能怎么查找另一台设备?很简单,只需这样操作
  11. Reg Organizer v8.75 注册表及系统清理优化工具
  12. Vue3 非常好用的中文文档以及一份 Vue 3 新文档学习笔记
  13. 敏捷.高效通过ACP.随笔
  14. python图形编程复选按钮和单选按钮详细说明_python GUI库图形界面开发之PyQt5复选框控件QCheckBox详细使用方法与实例...
  15. FTP工具免费,6大免费的FTP工具
  16. 武汉市最好的计算机专科学校,武汉中专排名前十位_武汉最好的3加2学校_武汉中专技校有哪些_计算机平面设计_365导学网...
  17. 修改idea的头部文档注释信息
  18. sql server数据库事务日志已满请参阅log_reuse_wait_desc怎么解决?
  19. 解决git pull中 fatal: Not possible to fast-forward, aborting
  20. Java删除文件夹和文件(最经典普通的写法)

热门文章

  1. CJOJ 2171 火车站开饭店(树型动态规划)
  2. Lachesis Shield 设计上的抉择
  3. Spring BeanDefinition
  4. Python黑科技:在家远程遥控公司电脑,python+微信一键连接!
  5. spring cloud gateway的stripPrefix配置
  6. K/3 MRP运算数据不准的原因及解决方案
  7. 强制修改上网本分辨率
  8. [MySQL FAQ]系列 -- 快速还原MyISAM表索引
  9. 图像去畸变和添加畸变
  10. halcon找矩形顶点的一种方法