算法提高 阶乘差
时间限制:1.0s 内存限制:256.0MB
问题描述
给定n和m以及p,保证n>=m,求(n!-m!)对p取余的结果。
输入格式
一行三个正整数n,m,p。
输出格式
一行一个非负整数表示结果。
样例输入
3 2 10
样例输出
4
数据规模和约定
n,m<=20,p<=10000.
分析:(a-b)%p可以这样来计算:首先分别计算a' = a%p,b' = b%p。若a' >= b',则待求值即为a'-b';否则待求值为a'-b'+p。
#include <stdio.h>
int main()
{
int n, m, p;
scanf("%d %d %d", &n, &m, &p);
int fac_n = 1, fac_m = 1;
for (int i = 1; i <= n; ++i)
fac_n = (fac_n * i) % p;
for (int i = 1; i <= m; ++i)
fac_m = (fac_m * i) % p;
int ans = fac_n - fac_m;
if (ans >= 0)
printf("%d", ans);
else
printf("%d", ans + p);
return 0;
}