poj 1150 The Last Non-zero Digit


 1 /**
2 大意: 求A(n,m)的结果中从左到右第一个非零数
3 思路: 0是由2*5的得到的,所以将n!中的2,5约掉可得(2的数目比5多,最后再考虑进去即可)
4 那n!中2 的个数怎么求呢?
5 int get2(int n){
6 if(n==0)
7 return 0;
8 return n/2+get2(n/2);
9 }
10 eg: 1*2*3*4*5*6*7*8*9*10 约去2,5可得,,1*1*3*1*1*3*7*1*9*1
11 所以最后肯定是3,7,9.。的数列,,那么在最后的数列中3,7,9,有多少个呢?
12 可以这样考虑: 1,2,3,4,5,6,7,8,9,10 可以分为奇偶数列 即 1,3,5,7,9 2,4,6,8,10===>2*(1,2,3,4,5)
13 这就出现了递归,,g(n) = g(n/2)+f(n) { f(n)为奇数列 }
14 那在奇数列中怎么找3,7,9 的个数呢?
15 1,3,5,7,9,11,13,15,17,19 有可以再分 1,3,7,9,11,13,17,19 ///5,15,25 ====〉5*(1,3,5)
16 这里有出现了递归,,f(n,x) = n/10 + (n%10>=x) + f(n/5,x)
17 **/
18
19 #include <iostream>
20 using namespace std;
21
22 int s[][4]={
23 {6,2,4,8},{1,3,9,7},{1,7,9,3},{1,9,1,9}
24 };
25 int get2(int n){
26 if(n==0)
27 return 0;
28 return n/2+get2(n/2);
29 }
30
31 int get5(int n){
32 if(n==0)
33 return 0;
34 return n/5+get5(n/5);
35 }
36
37 int get(int n,int x){
38 if(n==0)
39 return 0;
40 return n/10+(n%10>=x)+get(n/5,x);
41 }
42
43 int getx(int n,int x){
44 if(n==0)
45 return 0;
46 int res =0;
47 res = getx(n/2,x)+get(n,x);
48 return res;
49 }
50
51 int main()
52 {
53 int n,m;
54 while(cin>>n>>m){
55 int num2 = get2(n)-get2(n-m);
56 int num5 = get5(n)-get5(n-m);
57 int num3 = getx(n,3)-getx(n-m,3);
58 int num7 = getx(n,7)-getx(n-m,7);
59 int num9 = getx(n,9)-getx(n-m,9);
60 if(num2<num5){
61 cout<<5<<endl;
62 continue;
63 }else{
64 int res =1;
65 if(num2!=num5){
66 num2 = num2-num5;
67 res = res*s[0][num2%4];
68 res = res%10;
69 }
70 res *= s[1][num3%4];
71 res %=10;
72 res *= s[2][num7%4];
73 res %=10;
74 res *= s[3][num9%4];
75 res = res%10;
76 cout<<res<<endl;
77 }
78 }
79 return 0;
80 }

poj 1150 The Last Non-zero Digit

时间: 2024-10-12 02:41:44

poj 1150 The Last Non-zero Digit的相关文章

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

POJ 1150 The Last Non-zero Digit 数论+容斥 题目地址: POJ 1150 题意: 求排列P(n, m)后面第一个非0的数. 分析: 为了熟悉题目中的理论,我先做了俩初级的题目: POJ 1401,题解见:POJ 1401 && ZOJ 2202 Factorial 阶乘N!的末尾零的个数 NYOJ 954,题解见:NYOJ 954 求N!二进制末尾几个0 这题想了一下,十进制末尾几个0可以转化为几个5因子,二进制最后一位非0可以转化为2因子,但是10进制就

#数论-模运算#POJ 1150、1284、2115

1.POJ 1150 The Last Non-zero Digit #质因数分解+模运算分治# 先贴两份题解: http://www.hankcs.com/program/algorithm/poj-1150-the-last-non-zero-digit.html http://www.cppblog.com/abilitytao/archive/2009/10/31/99907.html 下面是自己看完题解(划掉)之后的理解: 题目要求出组合数Anm=n!/(n-m)!(说实话一开始不知道

POJ 1150-The Last Non-zero Digit(求阶乘最后一位非零数)

The Last Non-zero Digit Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 1150 Appoint description:  System Crawler  (2015-03-30) Description In this problem you will be given two decimal integer

POJ 3187 Backward Digit Sums(next_permutation)

Description FJ and his cows enjoy playing a mental game. They write down the numbers from 1 to N (1 <= N <= 10) in a certain order and then sum adjacent numbers to produce a new list with one fewer number. They repeat this until only a single number

POJ 3187 Backward Digit Sums

http://poj.org/problem?id=3187 穷竭搜索 全排列 然后按规则求和 排列之前先按升序排序 这样可以保证第一个和为k的就是符合最小序列的结果 1 #include <iostream> 2 #include <stdio.h> 3 #include <algorithm> 4 5 using namespace std; 6 7 int sum(int a[], int n) 8 { 9 int s[11]; 10 for (int i = 0

POJ 3187 Backward Digit Sums 题解 《挑战程序设计竞赛》

题目:POJ 3187 思路: 这道题很简单,用next_permutation枚举1~N的所有排列,然后依次相加,判断最后的和是否等于sum,是的话则break,即为字典序最前的. 1 #include <iostream> 2 #include <algorithm> 3 4 using namespace std; 5 6 int n; 7 int sum; 8 int mycase[11][11]; 9 10 int main() { 11 cin >> n &

POJ 3187 Backward Digit Sums (杨辉三角,穷竭搜索,组合数,DFS)

http://poj.org/problem?id=3187 将一行数按杨辉三角的规则计算为一个数,已知最后那个数和三角形的高度,求最初的那行数. 杨辉三角前10行:                   1                                   1   1                               1   2   1                           1   3   3   1                       1  

POJ 题目Backward Digit Sums(next_permutation)

Backward Digit Sums Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4807   Accepted: 2772 Description FJ and his cows enjoy playing a mental game. They write down the numbers from 1 to N (1 <= N <= 10) in a certain order and then sum ad

【POJ - 3187】Backward Digit Sums(搜索)

-->Backward Digit Sums 直接写中文了 Descriptions: FJ 和 他的奶牛们在玩一个心理游戏.他们以某种方式写下1至N的数字(1<=N<=10). 然后把相邻的数相加的到新的一行数.重复这一操作直至只剩一个数字.比如下面是N=4时的一种例子 3 1 2 4 4 3 6 7 9 16 在FJ回来之前,奶牛们开始了一个更难的游戏:他们尝试根据最后结果找到开始的序列.这已超过了FJ的思考极限. 写一个程序来帮助FJ吧 Input N和最后的和 Output 满足