[考试反思]0613四校联考第三轮day2:生活

[考试反思]0613四校联考第三轮day2:生活

终于把博客补全了/px

然而这场考得也好不到哪里去,写了四篇博客然而四场都是炸的。怪自闭的

说实在的这场至少分数不算低,还是可以接受的(谁要你自己接受啊

$T1$几乎可以说是很套路的题了,但是花的时间还是有点长了

然后$T2$数据非常水导致我写的随机化过了子任务$1,9,10$而剩下的$PC$了

$T3$很早就想到了$O(n^3)$的做法,但是因为数据很有梯度于是一直执着于卡常。

估分$64/68$那样,本机跑$64$的数据是$0.26s$交上去还是被卡了,我人都傻了

然而菜就是菜,搞得好像多$4pts$对我有什么影响一样

这一轮的两场下来,主要还是因为$day1$炸的太厉害了,所以总分依旧滚的有点远,貌似还是会被挤来挤去到退役线之外

教练说不要太看重模拟赛成绩所以其实我也没仔细研究。的确没必要

模拟赛只是在为以后各方面积累经验而已,在某些方面有提升这就足够了

 

T1:A

大意:$w\times h$的点阵,从中选取$n$个点在一条直线上的方案数。$w,h \le 10^5$

思路挺多的,比较可行的一个是枚举起点和终点然后在线段上的点中选取$n-2$。因为起点终点不同所以一定不重不漏。

然后发现其实我们只要枚举终点-起点这个向量就足够了。首先平行与坐标轴的特判掉,剩下的就是斜向左下或右下的两种。

等价的,只计数一种然后乘二就可以了。式子大约长这样:

$\sum\limits_{i=1}^{w} \sum\limits_{j=1}^{h} \binom{gcd(i,j)-1}{n-2} (w-i+1)(h-j+1)$

$=\sum\limits_{g=1}^{max(w,h)} \binom{g-1}{n-2} \sum\limits_{i=1}^{\frac{w}{g}} (w-ig+1) \sum\limits_{j=1}^{\frac{h}{g}} (h-jg+1) [gcd(i,j)=1]$

$=\sum\limits_{g=1}^{max(w,h)} \binom{g-1}{n-2}  \sum\limits_{i=1}^{\frac{w}{g}} \sum\limits_{j=1}^{\frac{h}{g}}  \sum\limits_{d|i,d|j} \mu(d) (w-ig+1) (h-jg+1)$

$=\sum\limits_{g=1}^{max(w,h)} \binom{g-1}{n-2}  \sum\limits_{d=1}^{\frac{max(w,h)}{g}} \mu(d) \sum\limits_{i=1}^{\frac{w}{gd}} \sum\limits_{j=1}^{\frac{h}{gd}}(w-igd+1) (h-jgd+1)$

$=\sum\limits_{gd=1}^{max(w,h)} \sum\limits_{g|dg} \binom{g-1}{n-2} \mu(\frac{gd}{g}) cal(w,gd) cal(h,gd)$

对于每种$gd$,$O(n\ ln\ n)$处理前半部分。后面的$cal$是$O(1)$的(等差数列求和),然后就可以直接做了。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int $=1e5+5,mod=323232323;
 4 int fac[$],inv[$],mu[$],np[$],p[$],pc,F[$],ans,w,h,n;
 5 int qp(int b,int t,int a=1){for(;t;t>>=1,b=1ll*b*b%mod)if(t&1)a=1ll*a*b%mod;return a;}
 6 int C(int b,int t){return 1ll*fac[b]*inv[t]%mod*inv[b-t]%mod;}
 7 int cal(int n,int d){int t=n/d;return (t*(n+1ll)-d*(t+1ll)*t/2)%mod;}
 8 int main(){
 9     freopen("a.in","r",stdin); freopen("a.out","w",stdout);
10     for(int i=fac[0]=1;i<$;++i)fac[i]=fac[i-1]*1ll*i%mod;
11     inv[$-1]=qp(fac[$-1],mod-2);
12     for(int i=$-2;~i;--i)inv[i]=inv[i+1]*(i+1ll)%mod;
13     mu[1]=1;
14     for(int i=2;i<$;++i){
15         if(!np[i])mu[i]=-1,p[++pc]=i;
16         for(int j=1,x;(x=i*p[j])<$;++j)
17             if(i%p[j])mu[x]=-mu[i],np[x]=1;
18             else{np[x]=1;break;}
19     }
20     scanf("%d%d%d",&w,&h,&n); if(w>h)swap(w,h); w--;h--;
21     if(n==1)return printf("%lld",(w+1ll)*(h+1)%mod),0;
22     for(int g=n-1;g<=h;++g)for(int x=g;x<=h;x+=g)F[x]=(F[x]+mu[x/g]*C(g-1,n-2))%mod;
23     for(int g=1;g<=h;++g)ans=(ans+F[g]*1ll*cal(w,g)%mod*cal(h,g))%mod;ans=ans*2%mod;
24     ans=(ans+(w+1ll)*C(h+1,n)+(h+1ll)*C(w+1,n))%mod;
25     printf("%d",(ans+mod)%mod);
26 }
View Code

相关文章:

  • 2022-12-23
  • 2021-11-23
  • 2022-12-23
  • 2021-10-02
  • 2022-12-23
  • 2022-03-08
  • 2021-05-27
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2021-05-24
  • 2022-01-01
  • 2021-07-26
  • 2022-01-04
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案