这道题其实处理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;
}
}