AGC这么hard的嘛,从A就开始卡题,然后只会AB。。

\(\bf A - Triangle\)

\(\bf Description\):在坐标系中找三个整点,使其构成三角形面积为 \(S/2\) , \(1 ≤ S ≤ 10^{18}\) , \(0 \leq X,Y \leq 10^9\)

\(\bf Solution\):我也不知道怎么说??设三个点分别在 \((a,0) , (0,b) , (x,y)\),且不妨设 \(a \leq x,b\leq y\),那么可得 \(S=2xy-ab-(x-a)y-x(y-b)\) ,整理可得 \(xy-S=(x-a)(y-b)\) 。

为了让 \(x,y,a,b \leq 10^9\) ,我们可以这么搞,找一对 \(x,y\) 使左边 \(\leq 10^9\),右边的话,直接 \(x-a=1\), \(y-b=xy-S\),然后 \(x,y\) 找两个接近 \(\sqrt S\) 的整数就过了。。

(其实可能还要证一下这样构造会满足 \(y \leq xy-S\) ,但是因为太懒就省略了。。)

好像和官方题解不太一样,好像官方题解会真一点。。

#include<bits/stdc++.h>
#define LL long long
#define fr(i,x,y) for(int i=(x);i<=(y);i++)
#define rf(i,x,y) for(int i=(x);i>=(y);i--)
#define frl(i,x,y) for(int i=(x);i<(y);i++)
using namespace std;
const int N=1002;
LL S; void read(LL &x){ scanf("%lld",&x); } int main(){
read(S);
LL x=sqrt(S)+0.0001,y=S/x;
if (x*y<S) x++;
LL v=x*y-S;
LL a=x-1,b=y-v;
printf("%lld %lld %lld %lld %lld %lld\n",a,0,0,b,x,y);
return 0;
}

\(\bf B - Do\ Not\ Duplicate\)

\(\bf Description\):给一个长度为 \(N\) 的数列 \(A\) ,将 \(A\) 重复 \(K\) 次得到数列 \(X\) ,将 \(X\) 中的数依次加入 \(s\) 中,规则是这样的:

  • 如果 \(s\) 中没有 \(X_i\) 这个数,将 \(X_i\) 加到末尾
  • 如果有,从末尾一直删除,直到数列中没有 \(X_i\) (不再加入)

求数列 \(s\) 。

\(\bf Solution\):为什么感觉AGC的题解好难写,一种说不清的感觉。。这题的话,我们关心一下每次数列被清空是啥时候,如果这次在加入 \(A_i\) 的时候是空的,那么 \(s\) 第一个数就变成了 \(A_{i}\) ,那下次清空就是再次出现 \(A_i\) 的时候,设为 \(A_j\) ,那么接下去 s 的第一个数就变成了 \(A_{j+1}\) 。于是,我们从 \(i\) 向 \(j+1\) 连一条边。沿着边走就会出现环,相当于有循环节,把循环节从 \(N \times K\) 里去掉,剩下的暴力就行。

具体可能还是要看代码实现,但是我代码很丑呢。。

#include<bits/stdc++.h>
#define LL long long
#define fr(i,x,y) for(int i=(x);i<=(y);i++)
#define rf(i,x,y) for(int i=(x);i>=(y);i--)
#define frl(i,x,y) for(int i=(x);i<(y);i++)
using namespace std;
const int N=200002;
int n,a[N];
int b[N];
int h[N],w;
int to[N];
LL K; void read(int &x){ scanf("%d",&x); }
void read(LL &x){ scanf("%lld",&x); } void gooo(int p,int s){ //暴力按题意加入数字
memset(b,0,sizeof b);
fr(i,1,s){
if (!b[a[p]]) h[++w]=a[p],b[a[p]]=1;
else{
while(h[w]!=a[p]) b[h[w]]=0,w--;
b[h[w]]=0;w--;
}
p=p%n+1;
}
fr(i,1,w) printf("%d ",h[i]);
} void goo(int p,LL s){ //暴力跳到最后一次清空
while(to[p]-p+1<=s){
s-=to[p]-p+1;
p=to[p]%n+1;
}
gooo(p,s);
} int main(){
read(n);read(K);
fr(i,1,n) read(a[i]);
rf(i,n,1) b[a[i]]=i+n;
rf(i,n,1) to[i]=b[a[i]],b[a[i]]=i;
memset(b,0,sizeof b);
int p=1;LL s=0,sc=0; //s表示从1走完循环节的总次数,sc表示循环节上的总次数
while(!b[p]){
b[p]=1;
s+=to[p]-p+1;
p=to[p]%n+1;
}
int q=p;
while(1){
sc+=to[q]-q+1;
q=to[q]%n+1;
if (q==p) break;
}
if (n*K<=s) goo(1,n*K);
else goo(p,(n*K-s)%sc);
return 0;
}

\(\bf C - GP 2\)

\(\bf Description\):一个长度为 \(n\) 的数列初始都为 \(0\) 。一次操作可以选择两个不同的位置,一个 \(+1\) ,一个 \(+2\) ,问 \(M\) 次操作后形成的数列有多少种可能,模 \(998244353\) 。

\(\bf Solution\):可以发现最后形成数列是合法的充要条件如下

  • \(\sum_{i=1}^n x_i=3M\)
  • \(max\{x_1,x_2,\cdots,x_n\} \leq 2M\)
  • \(\sum_{i=1}^n [x_i \ mod \ 2=1] \leq M\)

不证了,感性理解下= =这个结论我倒是发现了,但是不知道是不是因为太久没做TC,数数水平下降到哪里去都不知道了QAQ。

先不考虑第二个条件emmm。。然后我们可以枚举有几个奇数,总数就是 $$\sum_{i=1}^M {n \choose i} \cdot {(3M-i)/2+n-1 \choose n-1}$$

考虑把不满足第二个条件的答案踢出去。注意到大于 \(2M\) 的数最多只有一个,把它减去 \(2M\) 后,问题就转化为求下面这个数列的数量(不妨设这个大于 \(2M\) 的数为 \(x_1\) ,最后要乘 \(n\))

  • \(\sum_{i=1}^n x_i=M\)
  • \(\sum_{i=1}^n [x_i \ mod \ 2=1] \leq M\)
  • \(x_1>0\)

如果无视第三个条件的话,好像和上面求法差不多呢0_0

然后考虑怎么把不符合第三个条件的踢出去。那样的话 \(x_1=0\),问题又转化了:

  • \(\sum_{i=2}^n x_i=M\)
  • \(\sum_{i=2}^n [x_i \ mod \ 2=1] \leq M\)

还是一样的求法呢。。

贴代码

#include<bits/stdc++.h>
#define LL long long
#define fr(i,x,y) for(int i=(x);i<=(y);i++)
#define rf(i,x,y) for(int i=(x);i>=(y);i--)
#define frl(i,x,y) for(int i=(x);i<(y);i++)
using namespace std;
const int N=3000002;
const int p=998244353;
int n,m;
LL mul[N],inv[N];
LL ans; void read(int &x){ scanf("%d",&x); }
void read(LL &x){ scanf("%lld",&x); } LL qpow(LL a,int n){
LL ans=1;
for(LL sum=a;n;n>>=1,sum=sum*sum%p) if (n&1) ans=ans*sum%p;
return ans;
} void init(){
mul[0]=1;
frl(i,1,N) mul[i]=mul[i-1]*i%p;
inv[N-1]=qpow(mul[N-1],p-2);
rf(i,N-2,0) inv[i]=inv[i+1]*(i+1)%p;
} LL C(int n,int m){
if (n<0||m<0||n-m<0) return 0;
return mul[n]*inv[m]%p*inv[n-m]%p;
} void Add(LL &x,LL y){
x+=y;
while(x<0) x+=p;
while(x>=p) x-=p;
} int main(){
read(n);read(m);
init();
fr(i,0,m)
if ((3*m-i)%2==0) Add(ans,C(n,i)*C((3*m-i)/2+n-1,n-1)%p);
fr(i,0,m)
if ((m-i)%2==0) Add(ans,-C(n,i)*C((m-i)/2+n-1,n-1)%p*n%p);
fr(i,0,m)
if ((m-i)%2==0) Add(ans,C(n-1,i)*C((m-i)/2+n-2,n-2)%p*n%p);
cout<<ans<<endl;
return 0;
}

\(\bf D - Negative \ Cycle\)

传送门


后面的,可能也不太懂,先咕咕咕。。

AtCoder Grand Contest 036 A-C的更多相关文章

  1. Atcoder Grand Contest 036 D - Negative Cycle

    Atcoder Grand Contest 036 D - Negative Cycle 解题思路 在某些情况下,给一张图加或删一些边要使图合法的题目要考虑到最短路的差分约束系统.这一题看似和最短路没 ...

  2. AtCoder Grand Contest 036

    Preface 这篇已经鸽了好久的说,AGC037都打完了才回来补所以题目可能都记不大清楚了,如有错误请指正 这场感觉难度远高于上一场,从D开始就不会了,E没写(看了题解都不会写),F就是抄曲明姐姐的 ...

  3. AtCoder Grand Contest 036题解

    传送门 爆炸的比较厉害--果然还是菜啊-- \(A\) 我们强制一个点为\((0,0)\),那么设剩下两个点分别为\((a,b),(c,d)\),根据叉积可以计算出面积为\(ad-bc=S\),那么令 ...

  4. AtCoder Grand Contest 036 简要题解

    从这里开始 比赛目录 Problem A Triangle 考虑把三角形移到和坐标轴相交,即 然后能够用坐标比较简单地计算面积,简单构造一下就行了. Code #include <bits/st ...

  5. AtCoder Grand Contest 012

    AtCoder Grand Contest 012 A - AtCoder Group Contest 翻译 有\(3n\)个人,每一个人有一个强大值(看我的假翻译),每三个人可以分成一组,一组的强大 ...

  6. AtCoder Grand Contest 011

    AtCoder Grand Contest 011 upd:这篇咕了好久,前面几题是三周以前写的... AtCoder Grand Contest 011 A - Airport Bus 翻译 有\( ...

  7. AtCoder Grand Contest 031 简要题解

    AtCoder Grand Contest 031 Atcoder A - Colorful Subsequence description 求\(s\)中本质不同子序列的个数模\(10^9+7\). ...

  8. AtCoder Grand Contest 010

    AtCoder Grand Contest 010 A - Addition 翻译 黑板上写了\(n\)个正整数,每次会擦去两个奇偶性相同的数,然后把他们的和写会到黑板上,问最终能否只剩下一个数. 题 ...

  9. AtCoder Grand Contest 009

    AtCoder Grand Contest 009 A - Multiple Array 翻译 见洛谷 题解 从后往前考虑. #include<iostream> #include< ...

随机推荐

  1. 利用Dockerfile部署SpringBoot项目

    利用Dockerfile部署SpringBoot项目 1.创建一个SpringBooot项目并且打成jar包 2.在Linux中创建一个文件夹,来做docker测试 [root@izwz90lvzs7 ...

  2. android设置透明状态栏

    先是半透明效果(两种方法): 第一种(简单): //直接将下面的代码放在activity中的setContentView(R.layout.activity_main);中之前就行了 if (Buil ...

  3. 教你制作挂件头像 | 小程序七十二变之 canvas 绘制国旗头像

    昨天朋友圈被「请给我一面国旗@微信官方」刷屏,虽然知道是假的,但是从另一个角度来看,弄清楚如何实现更有趣. 1.canvas 这就不得不提到小程序中的 API canvas,H5 中也是有 canva ...

  4. idea中的java web项目(添加jar包介绍)和java maven web项目目录结构

    java web项目 web项目下web根目录名称是可以更改的 idea中新建java web项目,默认src为Sources Root,当然也可以手动改,在Sources Root下右键只能新建Pa ...

  5. 如和用python给女朋友做个专属她的软件

    如和用python给女朋友做个专属她的软件 在学习python的路上如果觉得枯燥就可以想我一样做一些有趣的事情就不会无聊了 python是一门及其有趣的语言. 人们都喜欢记住一些重要的日子,比如说跟女 ...

  6. angular4 httpclient拦截器

    1.创建服务: InterceptorService.ts import { Injectable } from '@angular/core'; import { HttpEvent,HttpInt ...

  7. 在Xamarin开发中,UWP环境下无法进入断点调试standard库的问题解决方案

    环境如下 选择的代码共享方案为standard模式 再多平台依赖注入的时候,断点一直提示没有加载文档. 进入到目标平台项目Debug文件夹下,查看.发现standard库引用进来后,对应的*.pdb文 ...

  8. 深入理解 web 协议(一)- http 包体传输

    本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/WlT8070LlrnSODFRDwZsUQ作者:吴越 开坑这个系列的原因,主要是在大前端学习的 ...

  9. unittest生成测试报告

    1.先导入HTMLTestRunner模块 2.实例一脚本如下 #coding=utf-8 import unittest import HTMLTestRunner #封装批量执行用例 def al ...

  10. win server 2008R2 安装telnet 在VM虚拟机中

    服务器端: 第一步:  安装telnet 先固定,ip地址,因为虚拟机之间通信需要同网段,所以先固定ip, 第二步: 服务管理器>功能>添加功能 >服务器上安装服务器端telnet ...