求大神优化
  • 板块学术版
  • 楼主ywh2013
  • 当前回复9
  • 已保存回复10
  • 发布时间2025/1/15 14:23
  • 上次更新2025/1/15 19:01:52
查看原帖
求大神优化
1602084
ywh2013楼主2025/1/15 14:23

此题何解?

可怜的小明还是小学生,编程教练就给他出了一道题。这道题给出了一个n和p,让他求(1!+2!+3!+…+n!) mod p的值。小明算了一个小时都没算完,他已经崩溃了。于是他找到了你,想让你帮忙解决这道疯狂的题。

注:n!表示n的阶乘,即1×2×⋯×n

个人代码

//#include<bits/stdc++.h>
//using namespace std;
//long long n,p,num,sum;
//int main(){
//	cin>>n>>p;
//	if(n>p)n=p-1;
//	for(int i=1;i<=n;i++){
//		num=1;
//		for(int j=2;j<=i;j++){
//			num*=j;
//			num%=p;
//			if(num==0)break;
//		}
//		sum+=num;
//		sum%=p;
//	}
//	cout<<sum;
//	return 0;
//}
#include<bits/stdc++.h>
using namespace std;
long long n,p,num,sum;
long long m(long long s){
	long long t=0; 
	for(long long i=1;i<=sqrt(s);i++){
		if(s%i==0)t=max(t,max(i,s/i));
	}
	return t;
}
int main(){
	cin>>n>>p;
	if(n>p)n=p-1;
	n=min(m(p),n);
	for(int i=1;i<=n;i++){
		num=1;
		for(int j=2;j<=i;j++){
			num*=j;
			num%=p;
			if(num==0)break;
		}
		sum+=num;
		sum%=p;
	}
	cout<<sum;
	return 0;
}

#[数据范围] 对于100%的数据,1≤n≤10^16,1≤p≤10000000。

看似简单,如不优化,必定超时

2025/1/15 14:23
加载中...