Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 5333 | Accepted: 1628 |
Description
In this problem you will be given two decimal integer number N, M. You will have to find the last non-zero digit of the
A(n, m)
.This means no of permutations of N things taking M at a time.
Input
The input contains several lines of input. Each line of the input file contains two integers N (0 <= N<= 20000000), M (0 <= M <= N).
Output
For each line of the input you should output a single digit, which is the last non-zero digit of
NP
M. For example, if
NP
M is 720 then the last non-zero digit is 2. So in this case your output should be 2.
Sample Input
10 10 10 5 25 6
Sample Output
8 4 2
和http://blog.youkuaiyun.com/jaihk662/article/details/77387773一模一样
只需要把程序中每个sum计算的最后一个函数调用去掉即可!
#include<stdio.h>
#include<string.h>
int sum[8], mod2[4] = {6,2,4,8}, mod3[4] = {1,3,9,7}, mod7[4] = {1,7,9,3}; /*n个末尾为x(3,7,9)相乘得出数最后一位的规律*/
int Jud(int n, int k) /*计算出2和5的因数个数*/
{
int y;
y = 0;
while(n!=0)
{
y += n/k;
n /= k;
}
return y;
}
int all(int n, int k)
{
if(n==0)
return 0;
if(n%10>=k)
return n/10+all(n/5, k)+1;
else
return n/10+all(n/5, k);
}
int how(int n, int k) /*计算末尾为3,7,9的数的个数*/
{
if(n==0)
return 0;
return how(n/2, k)+all(n, k);
}
int main(void)
{
int n, m, ans;
while(scanf("%d%d", &n, &m)!=EOF)
{
ans = 1;
memset(sum, 0, sizeof(sum));
sum[2] = Jud(n, 2)-Jud(n-m, 2);
sum[5] = Jud(n, 5)-Jud(n-m, 5);
sum[3] = how(n, 3)-how(n-m, 3)+how(n, 9)*2-how(n-m, 9)*2;
sum[7] = how(n, 7)-how(n-m, 7);
if(sum[2]>sum[5]) /*如果2的数量大于5的数量,则用部分2抵消所有的5*/
ans *= mod2[(sum[2]-sum[5])%4];
else if(sum[2]<sum[5]) /*否则,末尾乘5*/
ans *= 5;
ans = ans*mod3[sum[3]%4]*mod7[sum[7]%4];
printf("%d\n", ans%10);
}
return 0;
}