Solution

T1

首先,可以一眼看出这是一个完全图的一笔画问题。然后开始挖性质:

①根据欧拉图的性质,如果将我们一笔画中没有经过的边删去,那么剩下的节点的度数一定有000个或222个是奇数。

通过这个东西,我们可以挖出性质:

②如果nnn为奇数,可以发现这个完全图中所有节点的度数都是偶数,那么显然可以一笔画走完。答案为Cn2C_{n}^2Cn2​。

③如果nnn为偶数,我们要考虑删去最少数量的边,使得剩下的图形可以一笔画走完。

由于我们要删去最少的边,又因为每删去一条边两端的节点的度数都会减去111,所以

④删去没有公共节点的n−22\frac {n-2} 22n−2​条边,此时剩下的各个节点的度数只有222个为奇数,可以一笔画。

于是本题就做完了——如果nnn为奇数,直接输出Cn2C_{n}^2Cn2​;否则,输出Cn2−n−22C_{n}^2-\frac {n-2} 2Cn2​−2n−2​。

单次询问时间复杂度O(1)O(1)O(1)。

T2

首先,我们看到有几个Subtask的限制是m=0m=0m=0,于是我们就先思考m=0m=0m=0的情况。

定义fnf_{n}fn​表示m=0m=0m=0时的期望步数。

首先,我们砍掉一只圣盾大头鱼的圣盾,进行了111次操作;然后分类讨论,如果第二步直接补掉了这个没有圣盾的可爱大头鱼,就转化为了fn−1f_{n-1}fn−1​,概率为1n\frac 1 nn1​;否则,转化为了fnf_nfn​(但是有一只可爱的鱼鱼没有圣盾),概率为n−1n\frac {n-1} nnn−1​。

用式子表示就是fn=1n(fn−1+1)+n−1n(fn+1−1)+1f_n=\frac 1 n (f_{n-1}+1)+\frac {n-1} n (f_n+1-1) + 1fn​=n1​(fn−1​+1)+nn−1​(fn​+1−1)+1
即fn=fn−1+n+1f_n=f_{n-1}+n+1fn​=fn−1​+n+1
即fn=∑i=1ni+nf_n=\sum_{i=1}^n i + nfn​=∑i=1n​i+n
即fn=n(n+1)2+nf_n=\frac {n(n+1)} 2 +nfn​=2n(n+1)​+n。

期望得分303030分。


处理完了m=0m=0m=0的情况,然后处理一波m=1m=1m=1的情况。

可以发现,m=1m=1m=1相当于是从n=n+1,m=0n=n+1, m=0n=n+1,m=0的情况走一步转移而来;例如n=5,m=1n=5, m=1n=5,m=1的情况由n=6,m=0n=6, m=0n=6,m=0的情况转移而来。

设gng_ngn​表示m=1m=1m=1的情况,则有gn=fn+1−1=(n+1)(n+2)2+ng_n=f_{n+1}-1=\frac {(n+1)(n+2)} 2 +ngn​=fn+1​−1=2(n+1)(n+2)​+n


然后处理一般性的情况。

假设现在情况为n,mn,mn,m,那么我们有两种走向———干掉了一只无助的不带圣盾的大头鱼(mmm减一),转化为n,m−1n,m-1n,m−1并继续递归下去;还有一种可能是砍了一只可爱的圣盾大头鱼,使nnn变成n+m−1n+m-1n+m−1,mmm变成111,就转化为了上面m=1m=1m=1的情况,可以O(1)O(1)O(1)求出,这也是递归边界

同时,我们一边递归,要一边下传出现这种情况的概率。注意逆元,并且在递归前要对nnn取模(否则会溢出)。

献上部分代码方便各位巨佬理解:

inline int work(int n,int m,int now,int depth)
{if (m==1)  return ((work_1(n)+depth)*now)%mod;int ans=0;ans=(ans+work(n+m-1,1,(now*(frac(n,n+m)))%mod,depth+1))%mod;ans=(ans+work(n,m-1,(now*(frac(m,n+m)))%mod,depth+1))%mod;return ans;
}

这题太过分了,T2T2T2就出大期望题,做了我1.5h1.5h1.5h,差点自闭了……

T3

太菜了,比赛的忘记区间平移这个套路了……我太菜了……不然就切掉了……

首先,我们先二分找到一段前缀[1,r][1,r][1,r],使得这段前缀恰好不小于sss;即,如果前缀短一点这个值就小于sss了,长一点就与sss的差就更大了。显然,这段前缀的和要么是sss,要么是s+1s+1s+1;如果都不是我吃屎。 我们先特判一下这段前缀的和为sss的情况(直接输出),然后处理棘手的和为s+1s+1s+1的情况。

然后,我们开始向右平移这段区间。

我们不是要让这个和为sss吗?每次向右平移一格,会少掉一个数,多了一个数。我们处理出从第一个位置开始的最长前缀222的长度xxx,从rrr开始的最长前缀222的长度yyy。

如果x≥yx≥yx≥y,那么会是这样的一种情况:

即,整个区间向右平移yyy格。

否则,x<yx<yx<y,就这样啦:

即,整个区间向右平移xxx格,此时的左端点再向右一格使和减111。

综上所述,我们只需要:
①资瓷单点修改;
②资瓷查询从某个位置开始连续222的数量。

显然,我们可以通过二分套线段树或二分套树状数组求出,时间复杂度为O(nlog2n)O(nlog^2n)O(nlog2n)。

但事实上毫无必要,我们直接数据结构内二分即可,时间复杂度为O(nlogn)O(nlogn)O(nlogn)。

唉,真的人傻了……

T4

我没有打算A掉这题,于是就挖了个性质然后上反演拿了505050分。

如果p(a,b)=1p(a,b)=1p(a,b)=1,当且仅当:
①gcd⁡(a,b)=1\gcd(a,b)=1gcd(a,b)=1,即a,ba,ba,b互质;
②aaa与bbb在膜222意义下不同余。

然后,我们写出式子:

∑i=1n∑j=1n[gcd(i,j)=1,imod2≠jmod2]\sum_{i=1}^n \sum_{j=1}^n [gcd(i,j)=1, i\ mod\ 2≠j\ mod\ 2]∑i=1n​∑j=1n​[gcd(i,j)=1,i mod 2​=j mod 2]

哎?这不是个莫反的套路式吗?开心地反演一波:

∑i=1n∑j=1n[gcd(i,j)=1,imod2≠jmod2]\sum_{i=1}^n \sum_{j=1}^n [gcd(i,j)=1, i\ mod\ 2≠j\ mod\ 2]∑i=1n​∑j=1n​[gcd(i,j)=1,i mod 2​=j mod 2]
∑i=1n∑j=1n∑d∣gcd(i,j)[imod2≠jmod2]\sum_{i=1}^n \sum_{j=1}^n \sum_{d|gcd(i,j)}[i\ mod\ 2≠j\ mod\ 2]∑i=1n​∑j=1n​∑d∣gcd(i,j)​[i mod 2​=j mod 2]
=∑d=1nμ(d)even(d)×odd(d)=\sum_{d=1}^n \mu(d)\ even(d)×odd(d)=∑d=1n​μ(d) even(d)×odd(d)。

这里的even(d)even(d)even(d)表示,在1−n1-n1−n中所有ddd的倍数有多少个是偶数;odd(d)odd(d)odd(d)表示,在1−n1-n1−n中所有ddd的倍数有多少个是奇数。显然这两个函数都可以O(1)O(1)O(1)求出。

使用线性筛求出莫比乌斯函数后,本题可以O(n)O(n)O(n)做完。可惜的是,这样只有505050分,而剩下的505050分,由于我真的太菜了也不会了……QAQ

Code

T1

#include <bits/stdc++.h>
#define int long long
using namespace std;int t,n;inline int get_it(int k)
{return (k*k-k)/2;
}inline int read()
{int s=0,w=1;char ch=getchar();while (ch<'0'||ch>'9'){if (ch=='-')  w=-w;ch=getchar();}while (ch>='0'&&ch<='9'){s=(s<<1)+(s<<3)+(ch^'0');ch=getchar();}return s*w;
}signed main()
{t=read();while (t--){n=read();if (n&1)  printf("%lld\n",get_it(n));else printf("%lld\n",get_it(n)-n/2+1);}return 0;
}

T2

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int mod=998244353;int n,m;int quick_power(int x,int y)
{int res=1;for (;y;y=y>>1,x=(x*x)%mod){if (y&1)  res=(res*x)%mod;}return res;
}int ny(int k)
{return quick_power(k,mod-2);
}int frac(int x,int y)
{return (x*ny(y))%mod;
}inline int work_1(int n)
{n=(n+1)%mod;return (((n*n+n)%mod*ny(2))%mod+n-1)%mod;
}inline int work(int n,int m,int now,int depth)
{if (m==1)  return ((work_1(n)+depth)*now)%mod;int ans=0;ans=(ans+work(n+m-1,1,(now*(frac(n,n+m)))%mod,depth+1))%mod;ans=(ans+work(n,m-1,(now*(frac(m,n+m)))%mod,depth+1))%mod;return ans;
}signed main()
{cin>>n>>m;n%=mod;if (m==0){n%=mod;cout<<(((n*n+n)%mod*ny(2))%mod+n)%mod<<endl;return 0;}cout<<work(n,m,1,0)<<endl;return 0;
}

T3

`#include <bits/stdc++.h>
using namespace std;
const int maxl=2000005;

inline int read()
{
char c=getchar();
int x=0;
while(c<‘0’||c>‘9’)
c=getchar();
while(c>=‘0’&&c<=‘9’)
{
x=(x<<3)+(x<<1)+c-‘0’;
c=getchar();
}
return x;
}
inline void write(int x)
{
int sta[10],tp=0;
while(x)
{
sta[++tp]=x%10;
x/=10;
}
while(tp)
putchar(sta[tp–]+‘0’);
}

int n,q,u,v,a[maxl];
char opt;

struct SEGMENT_TREE
{
int sumv,cnt1;
}tree[maxl<<2];

void pushup(int rt)
{
tree[rt].sumv=tree[(rt<<1)].sumv+tree[(rt<<1)|1].sumv;
tree[rt].cnt1=tree[(rt<<1)].cnt1+tree[(rt<<1)|1].cnt1;
}

void build_tree(int l,int r,int rt)
{
if (l==r)
{
tree[rt].sumv=a[l],tree[rt].cnt1=(a[l]==1);
return;
}
int mid=(l+r)>>1;
build_tree(l,mid,(rt<<1)),build_tree(mid+1,r,(rt<<1)|1);
pushup(rt);
}

void change(int nl,int l,int r,int rt,int k)
{
if (lr)
{
tree[rt].cnt1=(k1),tree[rt].sumv=k;
return;
}
int mid=(l+r)>>1;
if (nl<=mid) change(nl,l,mid,(rt<<1),k);
else change(nl,mid+1,r,(rt<<1)|1,k);

pushup(rt);

}

int query_sum(int nl,int nr,int l,int r,int rt)
{
if (nl<=l&&r<=nr) return tree[rt].sumv;

int mid=(l+r)>>1,tot=0;
if (nl<=mid)  tot=query_sum(nl,nr,l,mid,(rt<<1));
if (nr>mid)  tot+=query_sum(nl,nr,mid+1,r,(rt<<1)|1);
return tot;

}

int query_1(int nl,int nr,int l,int r,int rt)
{
if (nl<=l&&r<=nr) return tree[rt].cnt1;

int mid=(l+r)>>1,tot=0;
if (nl<=mid)  tot=query_1(nl,nr,l,mid,(rt<<1));
if (nr>mid)  tot+=query_1(nl,nr,mid+1,r,(rt<<1)|1);
return tot;

}

int binary_sum(int x)
{
int rt=1,l=1,r=n,res=n;
while (l<r)
{
int mid=(l+r)>>1;
if (tree[(rt<<1)].sumv>=x) res=mid,r=mid,rt=(rt<<1);
else x-=tree[(rt<<1)].sumv,l=mid+1,rt=(rt<<1)|1;
}
if (tree[rt].sumv<=x) res=max(res,l);
return res;
}

int binary_1(int x)
{
int rt=1,l=1,r=n,res=n;
while (l<r)
{
int mid=(l+r)>>1;
if (tree[(rt<<1)].cnt1<=x) l=mid+1,x-=tree[(rt<<1)].cnt1,rt=(rt<<1)|1,res=mid;
else r=mid,rt=(rt<<1);
}
if (tree[rt].cnt1<=x) res=max(res,l);
return res;
}

inline void print(int l,int r,int x)
{
if (l<=r&&1<=l&&l<=n&&1<=r&&r<=n&&query_sum(l,r,1,n,1)==x)
{
write(l);
putchar(’ ‘);
write®;
putchar(’\n’);
}
else
puts(“none”);
}

int main()
{
n=read();
q=read();
for (int i=1;i<=n;i++) a[i]=read();

build_tree(1,n,1);while (q--)
{opt=getchar();while(opt!='A'&&opt!='C')opt=getchar();if (opt=='C'){u=read(),v=read();change(u,1,n,1,v),a[u]=v;}else{u=read();int p=binary_sum(u);int tmp=query_sum(1,p,1,n,1);if (tmp==u)  printf("%d %d\n",1,p);else{int cnt1,cnt2;if (a[1]==1)  cnt1=0;else cnt1=binary_1(0);if (a[p]==1)  cnt2=0;else cnt2=binary_1(query_1(1,p,1,n,1))-p+1;if (cnt1>=cnt2)  print(cnt2+1,p+cnt2,u);else print(2+cnt1,p+cnt1,u); }}
}
return 0;

}`## T4

//50 pts
#include <bits/stdc++.h>
#define int unsigned long long
#define rg register
using namespace std;
const int maxl=30000000;int t,n,pos=0;
int judge[maxl+5],prime[maxl/3],m[maxl+5];inline void init()
{for (rg int i=1;i<=maxl;i++)  m[i]=1;m[1]=1;for (rg int i=2;i<=maxl;i++){if (judge[i]==0)  m[i]=-1,prime[++pos]=i;for (int j=1;j<=pos;j++){int now=prime[j];if (i*now>maxl)  break;judge[i*now]=1;if (i%now)  m[i*now]=m[i]*m[now];else{m[i*now]=0;break;}}}
}signed main()
{cin>>t;init();while (t--){cin>>n;int ans=0;for (int i=1;i<=n;i+=2){int cnt=n/i;int res=(cnt/2)*(cnt-cnt/2);ans+=m[i]*res*2ull;}cout<<ans<<endl;}return 0;
}

洛谷10月月赛II题解相关推荐

  1. 【LGR-078】洛谷 10 月月赛 II T2深海少女与胖头鱼

    显然: 设 A [ i ] [ j ] 位 i 只 鱼 没 圣 盾 , j 只 鱼 有 圣 盾 则 转 移 为 A [ i ] [ j ] = ( A [ 1 ] [ i + j − 1 ] + 1 ...

  2. 洛谷10月月赛 2 t2 深海少女与胖头鱼

    洛谷10月月赛 2 t2 深海少女与胖头鱼 题目链接 参考资料:洛谷10月赛2讲评ppt; 本篇题解考完那天就开始写,断断续续写到今天才写完 本题作为基础的期望dp题,用来学习期望dp还是很不错的 ( ...

  3. 洛谷10月月赛Round.1| P3399 丝绸之路 [DP]

    题目背景 张骞于公元前138年曾历尽艰险出使过西域.加强了汉朝与西域各国的友好往来.从那以后,一队队骆驼商队在这漫长的商贸大道上行进,他们越过崇山峻岭,将中国的先进技术带向中亚.西亚和欧洲,将那里的香 ...

  4. 洛谷10月月赛Round.1| P3400 仓鼠窝[单调栈]

    题目描述 萌萌哒的Created equal是一只小仓鼠,小仓鼠自然有仓鼠窝啦. 仓鼠窝是一个由n*m个格子组成的行数为n.列数为m的矩阵.小仓鼠现在想要知道,这个矩阵中有多少个子矩阵!(实际上就是有 ...

  5. 「LuoguP4995」「洛谷11月月赛」 跳跳!(贪心

    题目描述 你是一只小跳蛙,你特别擅长在各种地方跳来跳去. 这一天,你和朋友小 F 一起出去玩耍的时候,遇到了一堆高矮不同的石头,其中第 ii 块的石头高度为 h_ihi​,地面的高度是 h_0 = 0 ...

  6. Mdoi R2 洛谷4月月赛I

    Mdoi R2 洛谷4月月赛I DIV2 A Car 题目描述 在MDOI市, 为了推行环保, 一辆车是否被限行的依据时车牌号和当天的日期. 车牌号的编码方式是这样的: **·**前三位均为大写字母, ...

  7. 洛谷 10月 csp-s 模拟赛 T1,T2解析及代码

    洛谷 10月 csp-s 模拟赛 T1,T2解析及代码 T1 Magenta Potion 题目描述 给定一个长为 nnn 的整数序列 aaa,其中所有数的绝对值均大于等于 222.有 qqq 次操作 ...

  8. 【洛谷月赛】洛谷11月月赛·Day1

    洛谷2614 计算器弹琴 本题地址: http://www.luogu.org/problem/show?pid=2614 题目描述 总所周知,计算器可以拿来干很多它本不应该干的事情,比如写作文.(参 ...

  9. 洛谷11月月赛(284pts rank85)

    https://www.luogu.org/contestnew/show/12006 我是比赛完后在去写的 这是我第一次打洛谷月赛,之前一次是比赛完才去看而且写了第一题就没写后面的了 284分,太水 ...

最新文章

  1. c语言实验设计报告,C语言实验设计报告.doc
  2. 个人随笔之《我有一个需要妈妈帮我实现的愿望》
  3. Makefile中的wilcard函数
  4. boost::gil::is_homogeneous用法的测试程序
  5. 网传不要升级.NET5的诸多原因,你赞同几个?
  6. 好爽 java_Intellij是进行scala开发的一个非常好用的工具,可以非常轻松查看scala源码,当然用它来开发Java也是很爽的,之前一直在用scala ide和ec...
  7. java学生签到系统视频教程_手把手教你做一个Java web学生信息、选课、签到考勤、成绩管理系统附带完整源码及视频开发教程...
  8. 【转载】前后端分离的思考与实践(五)
  9. css js写在一起 vue_如何把vue2.0 和 animate.css合并在一起使用(详细教程)
  10. http服务详解(2)——httpd2.2的配置文件常见设置
  11. c语言getch函数_在C / C ++中使用getch()函数
  12. oracle导入dmp文件出错,IMP导入时的错误以及解决办法
  13. 中文地址翻译成英文实例
  14. k8s基本概念及使用
  15. 第一章概述-------第一节--1.6 计算机网络的性能
  16. Renderdoc截帧
  17. Jedis Connection Pool
  18. Fe3O4 NPs@MIL-53|NH2-MIL-53(Sc)|NH2-MIL-53(Al)|NH2-MIL-125负载银钴合金纳米材料|氨基化mof材料
  19. 深度学习-训练集图片输入神经网络前的标准化(附代码)
  20. 为什么电源层可以作为信号参考平面

热门文章

  1. 一键ghost【onekey ghost】最新版本下载,一键ghost官网
  2. Android 增强版百分比布局库 为了适配而扩展
  3. 后台弹出页面或模式窗口
  4. 论文阅读笔记——Vulnerability Dataset Construction Methods Applied To Vulnerability Detection A Survey
  5. python中zerodivisionerror是什么意思-python里的raise是什么意思
  6. 一路走来,关于光城那些事
  7. WordPress网站速度优化教程
  8. 匹兹堡大学申请条件计算机科学,美国匹兹堡大学计算机科学专业好不好?
  9. 百度地图测距 java_【java】改写js百度地图测距方法
  10. 点对点文件服务器,点对点文件同步工具(Syncthing)