NOI模拟9
清北营赛制,能看见分,但是看不见名次
所以这是放假回来的第一次考试,然而考的并不好
开场看T1,兑着这题就看了一个小时,然后发现并没有什么结果,于是走了,走的彻彻底底,连暴力都没弄对
于是T2似乎切了,但是,我用的前向星建边,TLEEEE了,密集图用vector,稀疏图用前向星...
T3,魂淡题,老子就不喜欢打模拟,你小子还给我整个分类讨论大模拟,细节还贼多,你说魂淡不魂淡
T1 大天桥
多项式爆推,需要分母有理化,最后得到了答案的递推式
AC_code
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define fo(i,x,y) for(int i=(x);i<=(y);i++)
#define fu(i,x,y) for(int i=(x);i>=(y);i--)
int read(){
int s=0,t=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')t=-1;ch=getchar();}
while(isdigit(ch)){s=(s<<1)+(s<<3)+(ch^48);ch=getchar();}
return s*t;
}
const int N=1e7+5;
int n,k,mod,ans;
int ksm(int x,int y,int mo=mod){
int ret=1;
while(y){
if(y&1)ret=ret*x%mod;
x=x*x%mod;y>>=1;
}return ret;
}
int jc[N],inv[N];
signed main(){
freopen("flyover.in","r",stdin);
freopen("flyover.out","w",stdout);
n=read()>>1;k=read();mod=read();k%=mod;
jc[0]=1;fo(i,1,2*n)jc[i]=jc[i-1]*i%mod;
inv[0]=1;inv[2*n]=ksm(jc[2*n],mod-2);
fu(i,2*n-1,1)inv[i]=inv[i+1]*(i+1)%mod;
ans=1;int now=1;
fo(i,1,n){
now=now*(k-1)%mod;
ans=(ans*k%mod*k%mod-jc[2*i-2]*inv[i]%mod*inv[i-1]%mod*k%mod*now%mod+mod)%mod;
}
printf("%lld\n",ans);
return 0;
}
T2 中点图
四元环和三元环计数...
AC_code
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define fo(i,x,y) for(int i=(x);i<=(y);i++)
#define fu(i,x,y) for(int i=(x);i>=(y);i--)
int read(){
int s=0,t=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')t=-1;ch=getchar();}
while(isdigit(ch)){s=(s<<1)+(s<<3)+(ch^48);ch=getchar();}
return s*t;
}
const int N=5e5+5;
const int mod=998244353;
int T,n,m;ll ans;
struct D{int x,y;}d[N];
int du[N];vector<int> e[N],a[N];
int vis[N],cnt;
bool cmp(int x,int y){
if(du[x]!=du[y])return du[x]<du[y];
return x<y;
}
void find_3(){
fo(x,1,n){
for(int y:a[x])vis[y]=true;
for(int y:a[x])for(int z:a[y])if(vis[z])ans+=3;
for(int y:a[x])vis[y]=false;
}
}
void find_4(){
fo(x,1,n){
for(int y:e[x])for(int z:a[y])if(cmp(x,z))ans+=vis[z]++;
for(int y:e[x])for(int z:a[y])vis[z]=0;
}
}
signed main(){
freopen("graph.in","r",stdin);
freopen("graph.out","w",stdout);
T=read();
while(T--){
n=read();m=read();ans=0;
fo(i,1,n){du[i]=0;e[i].clear();a[i].clear();}
fo(i,1,m){
d[i].x=read();d[i].y=read();
du[d[i].x]++;du[d[i].y]++;
e[d[i].x].push_back(d[i].y);
e[d[i].y].push_back(d[i].x);
}
fo(i,1,m){
if(!cmp(d[i].x,d[i].y))swap(d[i].x,d[i].y);
a[d[i].x].push_back(d[i].y);
}
find_3();
// cerr<<ans<<endl;
find_4();
// cerr<<ans<<endl;
fo(i,1,n)ans+=1ll*du[i]*(du[i]-1)/2;
ans+=1ll*(n+m-3)*m;
printf("%lld\n",ans%mod);
}
return 0;
}
T3 游戏
呵呵呵,先堆到左上角,一点一点往右下挪,我是真的写崩了...
QQ:2953174821