N的阶乘 mod P
输入N和P(P为质数),求N! Mod P = ? (Mod 就是求模 %)
例如:n = 10, P = 11,10! = 3628800
3628800 % 11 = 10
Input
两个数N,P,中间用空格隔开。(N < 10000, P < 10^9)
Output输出N! mod P的结果。
Sample Input
10 11
Sample Output
10
运用公式:ab%p=(a%p)(b%p)%p
怎么推出来:(a+b)%m=(a%m+b%m)%m
我的问题:
我一开始想的是这跟分配律差不多,所以没有写外面的%p就写了两个%p,这是错的,为什么:因为你用括号里面求余想成完之后,万一还可以求余,那么就少求了一次,所以就错了。
例子; 3332%6=
错误的:33%632%6=32=6
正确的:(33%632%6)%6=6%6=0;
32*33=1056, 1056%6=0;
代码:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char** argv) {
long long n,p;
cin>>n>>p;
long long sum=1;
for(long long i=2;i<=n;i++){
sum=(sum%p)*(i%p)%p;
}
printf("%lld\n",sum) ;
return 0;
}
C++ 大数相乘算法
首先说一下乘法计算的算法:同样是模拟人工计算时的方法。
从低位向高位乘,在竖式计算中,我们是将乘数第一位与被乘数的每一位相乘,记录结果之后,用第二位相乘,记录结果并且左移一位,以此类推,直到计算完最后一位,再将各项结果相加,得出最后结果。
1、先算1253,35得到15个1,32得到6个10,31得到3个100,下面是存储结果的数组的形式
2、接下来算1255,55得到25个10,25得到10个100,51得到5个1000;
3、乘法过程完毕。接下来从 a[0]开始向高位逐位处理进位问题。a[0]留下5,把1 加到a[1]上,a[1]变为32 后,应留下2,把3 加到a[2]上……最终使得a里的每个元素都是1 位数,结果就算出来了
结果就是6625。
总结一个规律:即一个数的第i 位和另一个数的第j 位相乘所得的数,一定是要累加到结果的第i+j 位上。这里i,