关于卡常、玄学TLE以及评测鸡性能问题
查看原帖
关于卡常、玄学TLE以及评测鸡性能问题
393076
TLE_楼主2023/7/21 19:27

这道题其实处理C时暴算卡常是能卡过去的在,但是我在写这道题的时候遇上的一些奇怪的问题:把printf那里改成cout后(一开始忘记改了),会有两个评测点非常的玄学:我第一次交时时间是1.03秒TLE掉,同样代码没做优化又交了一次就996msAC了,不知道是不是评测鸡性能不稳定的问题()()()

还有就是警示后人:

1.这道题快速幂使用次数特别多,在快速幂时尽量用位运算,可以稍微卡掉一点时间。

2.这道题输入输出量特别大,尽量使用快速的读写方法,别用cin cout,我改了一个cout直接快了300多毫秒()

下面放上我改cout前的代码,已经A了这道题的人可以交一交看看是不是会出现我说的玄学TLE

——————防剧透———————

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

#include<bits/stdc++.h>
#define int long long
using namespace std;
int D[1000005];
int mod = 1e9 + 7;
int jc[1000003];

int pre(){
	D[0] = 1;
	D[1] = 0;
	for(int i = 2;i <= 1000002;i++){
		D[i] = (i - 1) % mod * (D[i - 1] + D[i - 2]) % mod;
	}
}
int qpow(int a,int b,int m){
	int ans = 1;
	while(b){
		if(b & 1){
			ans *= a;
		}
		b = b >> 1;
		a *= a;
		a %= m;
		ans %= m;
	}
	return ans;
}
void jcc(){
	jc[0] = 1;
	for(int i = 1;i <= 1000001;i++){
		jc[i] = jc[i - 1] * i % mod;
	}
}
int A(int n,int m){
	return(jc[n] * qpow(jc[n - m],mod - 2,mod)) % mod;
}
int C(int n,int m){
	return(A(n,m) * qpow(jc[m],mod - 2,mod)) % mod;
}
signed main(){
	jcc();
	pre();	
	int t;
	scanf("%d",&t);
//	cout << jc(3) << endl;
//	cout <<A(5,2);
	int n,m;
	while(t--){	
		scanf("%d%d",&n,&m);
//		cout <<endl << C(n,m)  << endl << D[n - m] << endl << endl;
		int cnm = C(n,m) % mod;
		int dnm = D[n - m] % mod;
//		printf("%d\n",(cnm * dnm % mod));
		cout << cnm * dnm % mod<< endl;
	}
}
2023/7/21 19:27
加载中...