关于取模方法的疑问(改版
查看原帖
关于取模方法的疑问(改版
1174843
yzm_lcoi_23楼主2024/7/19 08:07
#include<iostream>
#include<cstdio>
using namespace std;
#define ll long long 
#define ull unsigned long long 
inline ll re(){
	ll re=0;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		ch=getchar();}
	while(ch>='0'&&ch<='9'){
		re=(re<<3)+(re<<1)+(ch^48);
		ch=getchar();
	}
	return re;
}
const ull O=10086001,N=1e6+3;
inline ull _mod(ull x){	return x<O ? x:x-O;	}
ull ans[N],mul[N];
int main(){
	mul[0]=1;
	for(int i=1;i<=N;i++){
		mul[i]=_mod(mul[i-1]*i);
		ans[i]=mul[(i-1)>>1];
	}
	for(int i=1;i<=N;i++)	ans[i]=_mod(ans[i]+ans[i-1]);
	for(int i=1;i<=N;i++)	ans[i]=_mod(ans[i]+ans[i-1]);
	for(int i=1;i<=N;i++)	ans[i]=_mod(ans[i]+ans[i-1]);
	ll T=re();
	while(T--){
		printf("%llu\n",ans[re()]);
	}
	return 0;
}

上方是0分程序

下方是AC程序

#include<iostream>
#include<cstdio>
using namespace std;
#define ll long long 
#define ull unsigned long long 
inline ll re(){
	ll re=0;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		ch=getchar();}
	while(ch>='0'&&ch<='9'){
		re=(re<<3)+(re<<1)+(ch^48);
		ch=getchar();
	}
	return re;
}
const ull O=10086001,N=1e6+3;
inline ull _mod(ull x){	return x<O ? x:x-O;	}
ull ans[N],mul[N];
int main(){
	mul[0]=1;
	for(int i=1;i<=N;i++){
		mul[i]=(mul[i-1]*i)%O;
		ans[i]=mul[(i-1)>>1];
	}
	for(int i=1;i<=N;i++)	ans[i]=(ans[i]+ans[i-1])%O;
	for(int i=1;i<=N;i++)	ans[i]=(ans[i]+ans[i-1])%O;
	for(int i=1;i<=N;i++)	ans[i]=(ans[i]+ans[i-1])%O;
	ll T=re();
	while(T--){
		printf("%llu\n",ans[re()]);
	}
	return 0;
}

可见主要区别在前者与后者的取模方式
但是原因是什么却没看出来
请路过大犇指点
谢谢

2024/7/19 08:07
加载中...