这个是参考了别人之后的代码,POJ上0MS过了。Orz......对于一个序列在提取了2,5之后,例如1,2,3,4,5,6,7,8,9,10,我们可以将其中的奇数和偶数分开来对待,对于偶数序列2,4,6,8,10由于原序列会被提取出2,所以就退化成了1,2,3,4,5,这个奇数序列,对于奇数序列1,3,5,7,9我们就可以来统计3,5,7的数量了,同样出现的次数是总长度N=10除以10(单位出现区间)再判定N%10是否大于要求得数,对于这个奇数序列由于5是要被提取的,所以又变成了1这个序列,更多数可能更好看了。如此递归下去便行了。

代码如下:

#include <cstdlib>
#include <cstring>
#include <cstdio>
using namespace std;int N, M, rec[4][4] = {{6, 2, 4, 8},{1, 3, 9, 7},{1, 7, 9, 3},{1, 9, 1, 9}
};int Get2(int x)
{if (!x)    return 0;return x/2+Get2(x/2);
}int Get5(int x)
{    if (!x) return 0;return x/5+Get5(x/5);
}int GetOdd(int x, int Base)
{if (!x) return 0;return x/10 + (x%10 >= Base) + GetOdd(x/5, Base);
}
// 传进去的还是一个完整的序列,该函数的功能在于得到其偶数序列的性质
int GetEven(int x, int Base)
{if (!x) return 0;return GetEven(x/2, Base) + GetOdd(x, Base);
}int main()
{ int n2, n3, n5, n7, n9, m2, m3, m5, m7, m9, ret;while (scanf("%d %d", &N, &M) == 2) {ret = 1;M = N - M;n2 = Get2(N), m2 = Get2(M);n5 = Get5(N), m5 = Get5(M);n2 -= m2, n5 -= m5;if (n2 >= n5) { n2 -= n5, n5 = 0; }else { puts("5");continue; } n3 = GetEven(N, 3), m3 = GetEven(M, 3);n7 = GetEven(N, 7), m7 = GetEven(M, 7);n9 = GetEven(N, 9), m9 = GetEven(M, 9);n3 = (n3-m3)%4, n7 = (n7-m7)%4, n9 = (n9-m9)%4;if (n2) ret *= rec[0][n2%4];ret *= rec[1][n3] * rec[2][n7] * rec[3][n9];printf("%d\n", ret % 10);}return 0;
}

我的这个写法并不是最好的,POJ上的1150是没方法过的,UVA上的时限相对比较松。能在POJ上过的基本0MS,这段代码UVA上跑了7MS多。

解释见代码:

#include <cstdlib>
#include <cstring>
#include <cstdio>
using namespace std;
/*
计算排列数A(M,N)的最后一位非零位,A(M, N) = N! / (N-M)!
令 M = N - M,则问题转化为 N! / M!,从质因子的角度出发,我们一定能够得到 N! 的各项质因子的数量都一定
大于等于 M!,如果N比较小的话我们找可以出两者所有的质因子2,5的数量,以及以3,7,9结尾的质因子,再进行相消,最后得到结果。
如果N较大的话,就只关心质因子2,5的数量,相当于我们对于 N!写成 N! = 2^e1 * 5^e2 * x1 * x2 * x3 * ...,对于提出了2, 5
的序列,我们又可以将其视为1*2*3*4*...N/2(N/5)的一个序列(原序列为2*4*6*8*10*...或者是5*10*15*20*...),对于这样一个
重新编排的的序列,我们可以继续统计出2,5,我们还可以继续进行重拍,并且一直进行下去,提取出2,5后我们面对就是一系列的只
含有1,3,7,9的序列,因此我们还需要统计出它们(非质因子分解后)分别的数量,我们可以知道已这些结尾的数都是每10个数出现
一次,所以我们只需要对整个序列的长度除以10来得到,在重排除以2,5后的序列时要注意用容斥定理减去重复计算的
*/ int N, M, rec[4][4] = {{6, 2, 4, 8},{1, 3, 9, 7},{1, 7, 9, 3},{1, 9, 1, 9}
};int Get2(int x)
{if (!x)    return 0;return x/2+Get2(x/2);
}int Get5(int x)
{    if (!x) return 0;return x/5+Get5(x/5);
}int Get3(int x)
{ if (!x) return 0;return x/10 + (x%10>=3) + Get3(x/2) + Get3(x/5) - Get3(x/10);
}int Get7(int x)
{if (!x) return 0;return x/10 + (x%10>=7) + Get7(x/2) + Get7(x/5) - Get7(x/10);
}int Get9(int x)
{if (!x) return 0;return x/10 + (x%10>=9) + Get9(x/2) + Get9(x/5) - Get9(x/10);
}int main()
{// 对2,5处理只是为了把后面的零全部去除,最后一定只剩下n2// n2 表示的就是最有对最后一位非零位有贡献的因子2的个数// 2,3,7,9循环节的最小公倍数为4 int n2, n3, n5, n7, n9, m2, m3, m5, m7, m9, ret;while (scanf("%d %d", &N, &M) == 2) {ret = 1;M = N - M;n2 = Get2(N), m2 = Get2(M);n5 = Get5(N), m5 = Get5(M);n2 -= m2, n5 -= m5;if (n2 >= n5) {n2 -= n5;n5 = 0;}else {n5 -= n2;    n2 = 0;} n3 = Get3(N), m3 = Get3(M);n7 = Get7(N), m7 = Get7(M);n9 = Get9(N), m9 = Get9(M); n3 -= m3, n7 -= m7, n9 -= m9;if (n2) {ret *= rec[0][n2%4];}if (n5) {ret *= 5;    }n3 %= 4, n7 %= 4, n9 %= 4;ret = ret * rec[1][n3] * rec[2][n7] * rec[3][n9];printf("%d\n", ret % 10);}return 0;
}

转载于:https://www.cnblogs.com/Lyush/archive/2012/08/09/2629882.html

UVA-10212 The Last Non-zero Digit. 分解质因子+容斥定理相关推荐

  1. ZZULIOJ 1071:分解质因子

    分解质因子 题目描述 将一个正整数分解质因数,例如,输入90,输出2 3 3 5. 输入 输入一个正整数n(2<=n<=2000). 输出 从小到大输出n的所有质因子,每两个数之间空一格. ...

  2. ZZULIOJ:1071: 分解质因子

    1071: 分解质因子 时间限制: 1 Sec  内存限制: 128 MB [状态] [讨论版] [提交] [命题人:admin] 题目描述 将一个正整数分解质因数,例如,输入90,输出2 3 3 5 ...

  3. 等式(分解质因子求因子个数)

    链接: https://www.nowcoder.com/acm/contest/90/F 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言6553 ...

  4. PAT甲级1059 Prime Factors :[C++题解]分解质因子

    文章目录 题目分析 题目链接 题目分析 暴力求质因数 下面i就是质因子,s是质因子i的阶数. 暴力的时间复杂度O(n),会超时 void divide(int n){for(int i=2;i< ...

  5. 1072: 分解质因子

    时间限制: 1 Sec  内存限制: 128 MB 题目描述 将一个正整数分解质因数,例如,输入90,输出2 3 3 5. 输入 输入一个正整数n(2<=n<=2000). 输出 从小到大 ...

  6. 求一个数的最小素因子外加快速分解质因子

    这种方法使用与数据小于1e7, 这种适用于分解1到n所有数的质因子,而且打印出来是从小到大排好序的 首先找到每个数的最小质因子,不停的除以最小素因子,只到x==1 如果是分解单个还是根号n复杂度的更好 ...

  7. 关于求1~n中与m互质的数的个数(容器原理+数论分解质因子)

    D. Count GCD 这道题严格来讲不难,a[i]与b[i+1]最大公约数为a[i+1],所以a[i]与b[i+1]必定整除a[i+1],且a[i]/a[i+1]与b[i+1]/a[i+1]互质, ...

  8. java质,JAVA分解质因子 - osc_r1gtal48的个人空间 - OSCHINA - 中文开源技术交流社区

    /*题目 分解质因数(5分) 题目内容: 每个非素数(合数)都可以写成几个素数(也可称为质数)相乘的形式,这几个素数就都叫做这个合数的质因数.比如,6可以被分解为2x3,而24可以被分解为2x2x2x ...

  9. java因子的计算方法是_JAVA分解质因子

    /*题目 分解质因数(5分) 题目内容: 每个非素数(合数)都可以写成几个素数(也可称为质数)相乘的形式,这几个素数就都叫做这个合数的质因数.比如,6可以被分解为2x3,而24可以被分解为2x2x2x ...

最新文章

  1. 各行业2021薪酬报告来了,三大高薪行业令人羡慕
  2. asp.net core IIS发布
  3. Python中中文字符也算单个字符
  4. 搜狗发布全球首位 3D AI 主播,背后分身技术有玄机
  5. 计算机漏洞为什么无法避免,雷电3接口漏洞影响数百万计算机:5分钟解锁设备,无法修复...
  6. cocoapods 更新指定的第三方库
  7. 运筹学牛顿法c语言源代码,运筹学与MATlab编程.doc
  8. 马拉车算法(求最长回文串)
  9. tinymce 上传本地视频
  10. php文字滚动特效,js文字横向滚动特效_javascript技巧
  11. java运行不了_java运行不出来怎么回事?Java如何成功运行?
  12. Windows10系统桌面美化,定制自己的专属桌面.
  13. 吐血推荐 36招搞定电脑一切难题
  14. 学习maven的系列教程(正)
  15. 路由器的静态路由配置以及OSPF动态配置
  16. 你了解世界上功能最强大的开源数据库吗?
  17. ios13全选手势_iOS13大揭秘:深色模式、多任务、新手势等
  18. html5 人在星空中,人类在宇宙中就像一粒尘埃?看完这5张图片,谜底就揭晓了...
  19. 2010年财富杂志全球500强全名单 沃尔玛居榜首
  20. 【51单片机】计时器/计数器中断

热门文章

  1. 函数式编程语言python-函数式编程语言
  2. python小程序-python学习—几个简单小程序
  3. python手机版打了代码运行不了-android手机安装python并写代码运行
  4. python画饼图-从零开始学Python可视化(五): 饼图及环形图
  5. python 装饰器 参数-python装饰器的详细解析
  6. python利器的使用-PPython:PHP 拥抱 Python 的利器
  7. 对python来说、一个模块就是一个文件-Python如何将将模块分割成多个文件
  8. 自学python需要买书吗-Python入门到精通学习书籍推荐!
  9. python爬虫实战案例-Python爬虫实战案例:手机APP抓包爬虫
  10. LeetCode Path Sum II(dfs或者bfs)