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. redhat 7系统服务工具-systemctl

  2. Nullable Reference Types 可空引用类型

    在写C#代码的时候,你可能经常会遇到这个错误: 但如果想避免NullReferenceException的发生,确实需要做很多麻烦的工作. 可空引用类型 Null Reference Type 所以, ...

  3. 那些初学python犯过的小白错误(学习笔记1)

    一.关于print函数 区别于c和py2,py3的print的正确形式如下:print("hello world") 错误语句:print"hello world&quo ...

  4. C-01 手写数字识别

    目录 手写数字识别应用程序 一.导入模块 二.图像转向量 三.训练并测试模型 四.模型转应用程序 4.1 展示图片 4.2 处理图片 4.3 预测图片 更新.更全的<机器学习>的更新网站, ...

  5. CSS3新单位vw、vh、vmin、vmax使用详解

    像 px.em 这样的长度单位大家肯定都很熟悉,前者为绝对单位,后者为相对单位.CSS3 又引入了新单位:vw.vh.vmin.vmax.下面对它们做个详细介绍. 新单位也成为视窗单位,视窗(View ...

  6. 文本分类(TFIDF/朴素贝叶斯分类器/TextRNN/TextCNN/TextRCNN/FastText/HAN)

    目录 简介 TFIDF 朴素贝叶斯分类器 贝叶斯公式 贝叶斯决策论的理解 极大似然估计 朴素贝叶斯分类器 TextRNN TextCNN TextRCNN FastText HAN Highway N ...

  7. 关于Qt画点及计算机专业基础课程介绍

    在计算机图形图像学中,开始都是先画点,我曾经在汇编上tc2.0上画点,后来是MFC,VB,Qt,Python,我觉得对于计算机专业的选择QT的原因是它是个C系的功能强大庞大的库,可以少写很多代码,但是 ...

  8. QT文件读写操作笔记

    补一下这部分的笔记 简单的东西也记一下 操作系统一般都会提供一些列的标准对话框,如文件选择.字体选择.颜色选择等,这些标准对话框为应用层序提供了一致的观感.Qt对这些标准对话框都定义了相关的类,如:Q ...

  9. [CODEVS3366] 矿石

    题目描述 Description 经历了千辛万苦,小J找到了N块矿石.这些矿石都有毒性,但只要将两块矿石放在一起,再分开即可解毒.但任一两块矿石都可以互相吸引.为了降低吸引力,小J将他们放入一个直径仅 ...

  10. boost::asio::io_service::定时器任务队列

    使用io_service和定时器写的一个同步和异步方式的任务队列 #pragma once #include <string> #include <iostream> #inc ...