rt,这样一份代码
#include<bits/stdc++.h>
#define maxn 5000005
#define mo 998244353
using namespace std;
int n,k;
long long jc[maxn+5]={1},inv[maxn+5];
long long g[maxn+5]={1},erc[maxn+5]={1};
int read(){
int s=0,fu=1;
char a=getchar();
while(!isdigit(a)){
if(a=='-')fu=-1;
a=getchar();
}
while(isdigit(a)){
s=(s<<1)+(s<<3);
s+=a^48;
a=getchar();
}
return s*fu;
}
long long ksm(long long s,int c){
long long ans=1;
while(c){
if(c&1){
ans*=s;
ans%=mo;
}
s*=s;s%=mo;
c=c>>1;
}
return ans;
}
int main(){
int i,t,I;
for(i=1;i<=maxn;i++){
jc[i]=(i*jc[i-1])%mo;
}
inv[maxn]=ksm(jc[maxn],mo-2);
for(i=maxn-1;i>=0;i--){
inv[i]=inv[i+1]*(i+1)%mo;
}
for(i=2;i<=maxn;i++){
g[i]=(2*g[i-2]%mo*(i-1)%mo+g[i-1])%mo*4*i%mo*(i-1)%mo;
}
for(i=1;i<=maxn;i++){
erc[i]=erc[i-1]*2%mo;
}
t=read();
for(I=1;I<=t;I++){
n=read();
k=read();
printf("%lld\n",jc[n]*inv[n-k]%mo*jc[n]%mo*inv[n-k]%mo*inv[k]%mo*erc[k]%mo*g[n-k]%mo);
}
return 0;
}
#include<bits/stdc++.h>
#define maxn 5000005
#define mo 998244353
using namespace std;
int n,k;
long long jc[maxn+5]={1},inv[maxn+5];
long long g[maxn+5]={1},erc[maxn+5]={1};
int read(){
int s=0,fu=1;
char a=getchar();
while(!isdigit(a)){
if(a=='-')fu=-1;
a=getchar();
}
while(isdigit(a)){
s=(s<<1)+(s<<3);
s+=a^48;
a=getchar();
}
return s*fu;
}
long long ksm(long long s,int c){
long long ans=1;
while(c){
if(c&1){
ans*=s;
ans%=mo;
}
s*=s;s%=mo;
c=c>>1;
}
return ans;
}
int main(){
int i,t,I;
for(i=1;i<=maxn;i++){
jc[i]=(i*jc[i-1])%mo;
}
inv[maxn]=ksm(jc[maxn],mo-2);
for(i=maxn-1;i>=0;i--){
inv[i]=inv[i+1]*(i+1)%mo;
}
for(i=2;i<=maxn;i++){
g[i]=(2*g[i-2]%mo*(i-1)%mo+g[i-1])%mo*4*i%mo*(i-1)%mo;
}
for(i=1;i<=maxn;i++){
erc[i]=erc[i-1]*2%mo;
}
t=read();
for(I=1;I<=t;I++){
n=read();
k=read();
printf("%lld\n",jc[n]*inv[n-k]%mo*jc[n]%mo*inv[n-k]%mo*inv[k]%mo*erc[k]%mo*g[n-k]%mo);
}
return 0;
}
其编译需要10s+,交到洛谷直接CE,然后试着把全局变量的初始化放到了主函数内,
#include<bits/stdc++.h>
#define maxn 5000005
#define mo 998244353
using namespace std;
long long n,k;
long long jc[maxn+5],iinv[maxn+5];
long long g[maxn+5],erc[maxn+5];
long long read(){
long long s=0,fu=1;
char a=getchar();
while(!isdigit(a)){
if(a=='-')fu=-1;
a=getchar();
}
while(isdigit(a)){
s=(s<<1)+(s<<3);
s+=a^48;
a=getchar();
}
return s*fu;
}
long long ksm(long long s,int c){
long long ans=1;
while(c){
if(c&1){
ans*=s;
ans%=mo;
}
s*=s;s%=mo;
c=c>>1;
}
return ans;
}
int main(){
int i,t,I;
jc[0]=1;g[0]=1;erc[0]=1;
for(i=1;i<=maxn;i++){
jc[i]=(i*jc[i-1])%mo;
}
iinv[maxn]=ksm(jc[maxn],mo-2);
for(i=maxn;i>=1;i--){
iinv[i-1]=iinv[i]*i%mo;
}
for(i=2;i<=maxn;i++){
g[i]=(g[i-1]+2*g[i-2]*(i-1))%mo*4*i%mo*(i-1)%mo;
}
for(i=1;i<=maxn;i++){
erc[i]=erc[i-1]*2%mo;
}
t=read();
for(I=1;I<=t;I++){
n=read();
k=read();
printf("%lld\n",jc[n]*iinv[n-k]%mo*jc[n]%mo*iinv[n-k]%mo*iinv[k]%mo*erc[k]%mo*g[n-k]%mo);
}
return 0;
}
编译时间就正常了,并且顺利的AC了P4931。
灵异事件
为什么会这样?