[考试总结]noip模拟13
因为最近考试频繁,所以咕掉了好长时间。。。
淦,刚说完又来一场。。。
先咕了,等以后有时间再写。。。。
回来了。。。
首先看到这个题目们,感觉就不存好意。。。
然后开始开 \(T1\)。
只能蒻蒻地按照题目码一个 \(\mathcal O(n^2)\) 递推。
然后就开始疯狂暴力。。。
T1:
正解实际上是把这个方程还原。
然后可以发现这个式子的贡献可以使用组合数来计算。
然后其实就很简单了。
#include<bits/stdc++.h>
using std::cout; using std::endl;
#define debug cout<<"debug"<<endl
#define int long long
namespace xin_io
{
#define gc() p1 == p2 and (p2 = (p1 = buf) + fread(buf,1,1<<20,stdin),p1 == p2) ? EOF : *p1++
#define scanf eat1 = scanf
#define freopen eat2 = freopen
int eat1; FILE *eat2; char buf[1<<20],*p1 = buf,*p2 = buf;
inline void openfile() {freopen("t.txt","r",stdin);} inline void outfile() {freopen("o.txt","w",stdout);}
template<class type>inline type get()
{
type s = 0,f = 1; register char ch = gc();
while(!isdigit(ch)) {if(ch == '-') f = -1; ch = gc();}
while(isdigit(ch)) {s = s * 10 + ch - '0'; ch = gc();}
return s * f;
}
}
using namespace xin_io; static const int maxn = 1e6+10,inf = 0x7f7f7f7f,mod = 998244353;
#define try(i,a,b) for(register signed i=a;i<=b;++i)
#define throw(i,a,b) for(register signed i=a;i>=b;--i)
typedef long long ll;
namespace xin
{
int ans = 0,inv[maxn];
int f[maxn],g[maxn],fac[maxn];
int n,m,a,b;
inline void do_pre()
{
inv[1] = 1;
try(i,2,std::max(n,m)<<1) inv[i] = (mod - mod/i) * inv[mod % i] % mod;
fac[0] = fac[1] = 1;
try(i,2,std::max(n,m)<<1) fac[i] = fac[i - 1] * i % mod;
}
inline int ksm(int x,int y)
{
register int ret = 1;
while(y)
{
if(y & 1) ret = ret * x % mod;
x = x * x % mod; y >>= 1;
}
return ret % mod;
}
inline int C(int n,int m)
{
if(n == 0 or m == 0) return 1;
return fac[n] * ksm(fac[m] * fac[n-m] % mod,mod-2) % mod;
}
int af[maxn],bf[maxn];
inline short main()
{
#ifndef ONLINE_JUDGE
openfile();
#endif
n = get<ll>(); m = get<ll>(); a = get<ll>() % mod; b = get<ll>() % mod;
try(i,1,n) f[i] = get<ll>() % mod;
try(i,1,m) g[i] = get<ll>() % mod;
do_pre();
af[0] = bf[0] = 1;
try(i,1,n<<1) bf[i] = b * bf[i-1] % mod;
try(i,1,m<<1) af[i] = a * af[i-1] % mod;
try(i,0,0)
try(j,1,m)
ans += g[j] % mod * C(n-i+m-j-1,m-j) % mod * af[m-j] % mod * bf[n-i] % mod,ans %= mod;
try(j,0,0)
try(i,1,n)
ans += f[i] % mod * C(n-i+m-j-1,n-i) % mod * af[m-j] % mod * bf[n-i] % mod,ans %= mod;
cout<<ans<<endl;
return 0;
}
}
signed main() {return xin::main();}
T2:
对于这一个题目,我们首先打一个爆搜。。。
然后我就打错了。。。
好废啊。。。
然而还有一个部分分数。
然后就能愉快 \(40pts\)。
但是我废到只能拿到 \(0pts\)
正解实际上是一个树形 \(dp\)
但是我们发现这个万一不是树
但是是一个基环树
所以我们找到环,然后断开一条边就能让他成为一棵树。
所以我们从断开的两个端点开始进行树形 \(dp\)
然后取两次结果的最小值就是最后的答案。
#include<bits/stdc++.h>
using std::cout; using std::endl;
#define debug cout<<"debug"<<endl
namespace xin_io
{
#define gc() p1 == p2 and (p2 = (p1 = buf) + fread(buf,1,1<<20,stdin),p1 == p2) ? EOF : *p1++
#define scanf eat1 = scanf
#define freopen eat2 = freopen
int eat1; FILE *eat2; char buf[1<<20],*p1 = buf,*p2 = buf;
inline void openfile() {freopen("t.txt","r",stdin);} inline void outfile() {freopen("o.txt","w",stdout);}
template<class type>inline type get()
{
type s = 0,f = 1; register char ch = gc();
while(!isdigit(ch)) {if(ch == '-') f = -1; ch = gc();}
while(isdigit(ch)) {s = s * 10 + ch - '0'; ch = gc();}
return s * f;
}
}
using namespace xin_io; static const int maxn = 1e6+10,inf = 0x7f7f7f7f;
#define try(i,a,b) for(register signed i=a;i<=b;++i)
#define throw(i,a,b) for(register signed i=a;i>=b;--i)
typedef long long ll;
namespace xin
{
class xin_edge{public:int next,ver;}edge[maxn<<1];
int head[maxn],zhi = 1;
inline void add(int x,int y) {edge[++zhi].ver = y; edge[zhi].next = head[x]; head[x] = zhi;}
int vala,valb,n;
int f1[maxn][3],f2[maxn][3],w[maxn];
bool vis[maxn];
class xin_data
{
public:
int i,l,r;
xin_data(){}
xin_data(int i,int l,int r):i(i),l(l),r(r){}
}root;
void dfs(int x,int fa)
{
vis[x] = 1;
for(register int i=head[x];i;i=edge[i].next)
{
register int y = edge[i].ver;
if(fa == y) continue;
if(vis[y]) {root = xin_data(i,x,y);return;}
dfs(y,x);
}
}
void dp1(int x,int fa)
{
register int ret = 0;
f1[x][1] = w[x]; f1[x][0] = 0;
for(register int i=head[x];i;i=edge[i].next)
{
register int y = edge[i].ver;
if(y == fa or root.i == i or ((root.i xor 1) == i)) continue;
dp1(y,x);
ret += std::min(f1[y][1],f1[y][0]);
f1[x][0] += f1[y][1];
}
f1[x][1] += ret;
}
void dp2(int x,int fa)
{
register int ret = 0;
f2[x][1] = w[x]; f2[x][0] = 0;
for(register int i=head[x];i;i=edge[i].next)
{
register int y = edge[i].ver;
if(y == fa or root.i == i or ((root.i xor 1) == i)) continue;
dp2(y,x);
ret += std::min(f2[y][1],f2[y][0]);
f2[x][0] += f2[y][1];
}
f2[x][1] += ret;
}
inline short main()
{
#ifndef ONLINE_JUDGE
openfile();
#endif
n = get<signed>(); vala = get<signed>(); valb = get<signed>();
try(i,1,n)
{
register int x = get<signed>(),y = get<signed>();
w[x] += vala; w[y] += valb;
add(x,y); add(y,x);
}
dfs(1,0);
dp1(root.l,0);
dp2(root.r,0);
cout<<std::min(f1[root.l][1],f2[root.r][1])<<endl;
return 0;
}
}
signed main() {return xin::main();}
T3:
这个就是要求:
\]
的值。
然后我们发现这个 \(1\) 的正负只和 \(\sum_{j=1}^md(i*j)\) 有关
所以我们只需要知道这个东西的奇偶性就可以了
我们发现对于一个数,他的约数中如果含有完全平方数,那么它的约数个数就不是奇数,所以我们就可以开始筛出完全平方数的数量。
我们对于 \(i\) 可以将其拆成 \(p*x^2\) 的形式,然后 \(j\) 也可以拆成 \(p*y^2\) 的形式。
我们只需要线性筛出即可。
[考试总结]noip模拟13的更多相关文章
- 5.23考试总结(NOIP模拟2)
5.23考试总结(NOIP模拟2) 洛谷题单 看第一题第一眼,不好打呀;看第一题样例又一眼,诶,我直接一手小阶乘走人 然后就急忙去干T2T3了 后来考完一看,只有\(T1\)骗到了\(15pts\)[ ...
- 6.17考试总结(NOIP模拟8)[星际旅行·砍树·超级树·求和]
6.17考试总结(NOIP模拟8) 背景 考得不咋样,有一个非常遗憾的地方:最后一题少取膜了,\(100pts->40pts\),改了这么多年的错还是头一回看见以下的情景... T1星际旅行 前 ...
- 5.22考试总结(NOIP模拟1)
5.22考试总结(NOIP模拟1) 改题记录 T1 序列 题解 暴力思路很好想,分数也很好想\(QAQ\) (反正我只拿了5pts) 正解的话: 先用欧拉筛把1-n的素数筛出来 void get_Pr ...
- 2021.9.17考试总结[NOIP模拟55]
有的考试表面上自称NOIP模拟,背地里却是绍兴一中NOI模拟 吓得我直接文件打错 T1 Skip 设状态$f_i$为最后一次选$i$在$i$时的最优解.有$f_i=max_{j<i}[f_j+a ...
- [考试总结]noip模拟23
因为考试过多,所以学校的博客就暂时咕掉了,放到家里来写 不过话说,vscode的markdown编辑器还是真的很好用 先把 \(noip\) 模拟 \(23\) 的总结写了吧.. 俗话说:" ...
- 「考试」noip模拟9,11,13
9.1 辣鸡 可以把答案分成 每个矩形内部连线 和 矩形之间的连线 两部分 前半部分即为\(2(w-1)(h-1)\),后半部分可以模拟求(就是讨论四种相邻的情况) 如果\(n^2\)选择暴力模拟是有 ...
- 2021.9.13考试总结[NOIP模拟52]
T1 路径 考虑每一位的贡献,第$i$位每$2^i$个数会变一次,那么答案为$\sum_{i=1}^{log_2n} \frac{n}{2^i}$. $code:$ 1 #include<bit ...
- 2021.8.13考试总结[NOIP模拟38]
T1 a 入阵曲.枚举矩形上下界,之后从左到右扫一遍.用树状数组维护前缀和加特判可以$A$,更保险要脸的做法是双指针扫,因为前缀和单调不减. $code:$ 1 #include<bits/st ...
- 6.11考试总结(NOIP模拟7)
背景 时间分配与得分成反比,T1 20min 73pts,T2 1h 30pts,T3 2h 15pts(没有更新tot值,本来应该是40pts的,算是本次考试中最遗憾的地方了吧),改起来就是T3比较 ...
随机推荐
- 【MySQL】MySQL Workbench 8.0 CE 界面汉化
汉化前: 找到这个文件: 打开文件,复制下面这段替换进去保存,重新打开软件即可:(*改之前备份一下) <?xml version="1.0"?> <data> ...
- java学习笔记1(入门级)
Java包括三大块 JavaSE (Java标准版) JavaEE(Java企业版) JavaME(Java微型版) Java语言特性 简单性:例如C++支持多继承, ...
- [Docker核心之容器、数据库文件的导入导出、容器镜像的导入导出]
[Docker核心之容器.数据库文件的导入导出] 使用 Docker 容器 在 Docker 中,真正对外提供服务的还是容器,容器是对外提供服务的实例,容器的本质是进程. 运行一个容器 docker ...
- VBS脚本编程(2)——运算符
算数运算符 用于执行数学计算的运算符. 1.加法运算符( + ) 计算两个数之和. 2.减法运算符( - ) 计算两个数值的差或表示数值表达式的负值. 3.乘法运算符(*) 计算两个数之积. 4.除法 ...
- 六、JavaSE语言基础之数组
一维数组(关键字[]) 关于数组的一些概念: 数组是多个基本数据有机组合形成一个复杂数据,是一个引用数据类型数据. 数组:装指定数量元素类型相同的数据的容器. 元素:在数组中,数组中的每个数据称之为数 ...
- centos使用yum安装docker
1.先决条件 要安装 Docker 引擎,您需要 CentOS 7 或 8 的维护版本.不支持或测试存档版本. 该centos-extras库必须启用.默认情况下启用此存储库,但如果您已禁用它,则需要 ...
- [Django REST framework - 视图组件之视图基类、视图扩展类、视图子类、视图集]
[Django REST framework - 视图组件之视图基类.视图扩展类.视图子类.视图集] 视图继承关系 详图见文章末尾 视图组件可点我查看 两个视图基类:APIView.GenericAP ...
- 计算机、程序和java简介
内存 计算机的内存是由一个有序的字节序列组成,用于存储程序及程序需要的数据.你可以将内存想象成计算机执行程序的工作区域.一个程序和它的数据在被CPU执行前必须移到计算机的内存中. 每个字节都是有一个唯 ...
- Java程序设计(2021春)——第一章续笔记与思考
Java程序设计(2021春)--第一章续笔记与思考 目录 Java程序设计(2021春)--第一章续笔记与思考 Java数据类型 基本数据类型 引用类型 基本数据类型--整数类型的细节 基本数据类型 ...
- netcore3.1 + vue (前后端分离) IIS 部署
1.安装 aspnetcore-runtime-3.1.1-win-x64.exe 2.安装dotnet-hosting-3.1.1-win.exe 3.安装urlrewrite和applicatio ...