poj 1150

原创 2015年07月07日 10:32:53

求最后一个非0位

题目描述:

超大组合数:求超大组合数P(n, m)的最后一个非零位。

题解:

n!/m!的最后一位.可以看出来有几个2和几个5,搞出来有几个10.然后再除以他们之后%10.发现阶乘直接%10不行,因为10是质合数.因此可能这样做:先拆成%5和%2但是发现除以10的x次方之后的数字不好写成形式.于是换这样的方法:只需要是个位,因此只看个位:先看2和5的多少.如果5多于2,一定是5.如果2等于5.那么剩下的就是全部刨去2和5之后剩下的个位数.剩下的3,7,9看结尾的有几个就好了.而如果2多于5,那么结果乘以2就好.之后就是具体怎么算个位的数.对于n,先看奇数,偶数不能处理,因此递归到之后n/2.奇数中的5的倍数,不能处理,因此递归到处理奇数的n/5.

重点:

首先是思路:除去5和2的个位数的统计.
其次是统计:首先递归处理n.然后对n分奇偶.之后对于奇数,在对5进行一次递归

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <ctype.h>
#include <limits.h>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
#include <stack>
#include <set>
#include <bitset>
#define CLR(a) memset(a, 0, sizeof(a))
#define REP(i, a, b) for(int i = a;i < b;i++)
#define REP_D(i, a, b) for(int i = a;i <= b;i++)

typedef long long ll;

using namespace std;

int n, m;
int cal_odd(int n, int a)//计算奇数.
{
    if(n==0)
    {
        return 0;
    }
    int ans = 0;
    ans = n/10;
    int t = n%10;
    if(t >= a)
    {
        ans++;
    }
    ans += cal_odd(n/5, a);//重点.计算奇数5.那么递归计算奇数5
    return ans;
}
int cal_n(int n, int a)
{
    if(n==0)
    {
        return 0;
    }
    int ans;
    ans = cal_n(n/2, a) + cal_odd(n, a);//递归
    return ans;
}
int cal_n_2_5(int n, int a)//正常统计
{
    int res = 0;
    while(n!=0)
    {
        res += n/a;
        n /= a;
    }
    return res;
}

int mod(int x, int m)
{
    return (x-1)%m + 1;
}

void solve()
{
    int e3, e7, e9;
    int e5 = cal_n_2_5(n, 5)-cal_n_2_5(m,5),e2=cal_n_2_5(n, 2)-cal_n_2_5(m,2);
    if(e5 > e2)
    {
        printf("5\n");
    }
    else
    {
        e3 = cal_n(n, 3)-cal_n(m, 3);
        e7 = cal_n(n, 7)-cal_n(m, 7);
        e9 = cal_n(n, 9)-cal_n(m, 9);
        e3 = mod(e3, 4);
        e7 = mod(e7, 4);
        e9 = mod(e9, 2);
        int res = 1;
        while(e3!=0)
        {
            res *= 3;
            e3--;
        }
        res %= 10;
        while(e7!=0)
        {
            res *= 7;
            e7--;
        }
        res %= 10;
        while(e9!=0)
        {
            res *= 9;
            e9--;
        }
        res %= 10;
        if(e2 > e5)
        {
            e2 -= e5;
            e2 = (e2 - 1)%4 + 1;
            //e2 %= 4;
            while(e2!=0)
            {
                res *= 2;
                e2--;
            }
        }
        res %= 10;
        printf("%d\n", res%10);
    }
}

int main()
{
    //freopen("1Ain.txt", "r", stdin);
    //freopen("1Aout.txt", "w", stdout);
    while(scanf("%d%d", &n, &m) != EOF)
    {
        m = n - m;
        solve();
    }
    return 0;
}

HDU1150最小点覆盖

Machine Schedule Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)...
  • qq_34731703
  • qq_34731703
  • 2017年02月12日 01:35
  • 609

BZOJ 1150 二叉堆(优先队列) + 贪心

!!! 先打几个感叹号表示一下WA了一上午的愤慨。 总结一下题意,就是一条数轴上有n个点,要求选出k对点,求这k对点的距离和的最小值是多少。 首先可以证明我们不能嵌套着选,比如依次有1,2,3,...
  • qq_25978793
  • qq_25978793
  • 2015年08月15日 15:24
  • 615

1150: 数数多少个整数

1150: 数数多少个整数 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 1378  Solved: 805 SubmitStatusWeb...
  • sd_DENG
  • sd_DENG
  • 2017年07月10日 17:14
  • 118

POJ 4083 我爱北大

这道题真的是目前为止见过的最有情怀的题目之一,感觉做完以后就不再爱北大了…1、因为最后要求输出任意两个路径之间的最短距离,因此我选择使用的Floyd算法(数据比较弱,样例代码是贪心,应该也能过),Fl...
  • qq_32817311
  • qq_32817311
  • 2015年11月17日 17:16
  • 1080

POJ 难度及题型题目分类

OJ上的一些水题(可用来练手和增加自信) (poj3299,poj2159,poj2739,poj1083,poj2262,poj1503,poj3006,poj2255,poj3094) 初期:...
  • u010871244
  • u010871244
  • 2013年07月16日 10:34
  • 1941

(经典)POJ-3280 回文串DP

题目大意:给定一个字符串S及其长度M与S所含有的字符种数N(最多26种小写字母),然后给定这N种字母Add与Delete的代价,求将S变为回文串的最小代价和。 题目链接:点击打开链接 分析: ...
  • AC_hell
  • AC_hell
  • 2016年05月12日 19:36
  • 555

poj1623 象限四分树

Squadtrees Time Limit: 10000MS   Memory Limit: 32768K Total Submissions: 389   Acc...
  • u012866104
  • u012866104
  • 2015年06月22日 14:21
  • 1080

poj初期基本算法

想想接触ACM已经一年了,参加ACM也半年了。大四只有少量的课程,一般都准备考研、找工作、实习了。想想我的大学生活俨然已经走过了一半,一年半以来,不说自己大学过得如何,至少做的还不算太差,时间过的真是...
  • consciousman
  • consciousman
  • 2017年01月13日 17:30
  • 859

北大POJ题库使用指南

[转载]北大POJ题库使用指南  (2012-03-30 21:54:45) 转载▼ 标签:  转载 分类: ACM 原文地址:...
  • Enjoying_Science
  • Enjoying_Science
  • 2014年11月05日 19:59
  • 3197

POJ题目分类推荐 (很好很有层次感)

OJ上的一些水题(可用来练手和增加自信)  (poj3299,poj2159,poj2739,poj1083,poj2262,poj1503,poj3006,poj2255,poj3094) 初期...
  • verticallimit
  • verticallimit
  • 2013年09月15日 21:00
  • 17833
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:poj 1150
举报原因:
原因补充:

(最多只允许输入30个字)