1. 程式人生 > >The Last Non-zero Digit POJ - 1150

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); } }