The Last Non-zero Digit POJ - 1150

求排列(n,m)的最后一个非0数

首先求出N/(N-M)的阶乘中2的因子个数,5的因子个数

然后2 和 5 相互抵消,那个剩下的会对最终个位数字产生影响

然后需要找到整个数消去2和5的因子的乘积表达式中的个位数中3 7 9 的个数,因子2和5都消去了,就不需要考虑个位2 4 5 8那些数了

然后我们从最初的状态考虑,而不要直接去从数被消去2和5后考虑

假设我们20! ,也就是1 2 3 4 5....

然后我们将数列分为1 3 5 7 9....., 2 4 6 8 10....

第一个数列没有2因子,然后我们再分解数列为1 3 7 9 11 13 17 19 ....        5 10 15 20 25

显然分解后的第一个数列不存在2因子和5因子,这样我们就可以直接统计了, 而右边的消去2 和5 之后又是一个子问题

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iomanip>
#include<assert.h>
#include<ctime>
#include<time.h>
#include<vector>
#include<list>
#include<map>
#include<set>
#include<sstream>
#include<stack>
#include<queue>
#include<string>
#include<bitset>
#include<algorithm>
using namespace std;
#define me(s)  memset(s,0,sizeof(s))
#define pf printf
#define sf scanf
#define Di(x) int x;scanf("%d",&x)
#define in(x) inp(x)
#define in2(x,y) inp(x),inp(y)
#define in3(x,y,z) inp(x),inp(y),inp(z)
#define ins(x) scanf("%s",x)
#define ind(x) scanf("%lf",&x)
#define IO ios_base::sync_with_stdio(0);cin.tie(0)
#define READ freopen("C:/Users/ASUS/Desktop/in.txt","r",stdin)
#define WRITE freopen("C:/Users/ASUS/Desktop/out.txt","w",stdout)
template<class T> void inp(T &x) {//读入优化
    char c = getchar(); x = 0;
    for (; (c < 48 || c>57); c = getchar());
    for (; c > 47 && c < 58; c = getchar()) { x = (x << 1) + (x << 3) + c - 48; }
}
typedef pair <int, int> pii;
typedef long long ll;
typedef unsigned long long ull;
const int inf = 0x3f3f3f3f;
const double pi = acos(-1.0);
const double eps = 1e-15;
int num2[2],num5[2],num3[2],num7[2],num9[2];
inline int Count_2(int k){
    return k<2?0:Count_2(k/2)+k/2;
}
inline int Count_5(int k){
    return k<5?0:Count_5(k/5)+k/5;
}
inline int Count_num(int k,int x){
    return k?Count_num(k/5,x)+((k%10)>=x?1:0)+k/10:0;
}
inline int Count(int k,int x){
    return k<2?0:Count(k/2,x)+Count_num(k,x);
}
int loop[10][5];
int main(){
    loop[2][0]=6,loop[2][1]=2,loop[2][2]=4,loop[2][3]=8;
    loop[3][0]=1,loop[3][1]=3,loop[3][2]=9,loop[3][3]=7;
    loop[7][0]=1,loop[7][1]=7,loop[7][2]=9,loop[7][3]=3;
    loop[9][0]=1,loop[9][1]=9;
    int n,m;
    while(sf("%d%d",&n,&m)==2){
        m=n-m;
        num2[0]=Count_2(n),num2[1]=Count_2(m);   
        num2[0]-=num2[1];
        num5[0]=Count_5(n),num5[1]=Count_5(m);
        num5[0]-=num5[1];
        num3[0]=Count(n,3),num3[1]=Count(m,3);
        num3[0]-=num3[1];
        num7[0]=Count(n,7),num7[1]=Count(m,7);     
        num7[0]-=num7[1];
        num9[0]=Count(n,9),num9[1]=Count(m,9);
        num9[0]-=num9[1];
        int a,b,c,d;
        a=b=c=d=1;
        if(num2[0]>num5[0]) a*=loop[2][(num2[0]-num5[0])%4];
        if(num5[0]>num2[0]) a*=5;
        b=loop[3][num3[0]%4];
        c=loop[7][num7[0]%4];
        d=loop[9][num9[0]%2];
        pf("%d\n",(a*b*c*d)%10);
    }
        
}

猜你喜欢

转载自www.cnblogs.com/033000-/p/10092855.html