因为最近考试频繁,所以咕掉了好长时间。。。

淦,刚说完又来一场。。。

先咕了,等以后有时间再写。。。。

回来了。。。

首先看到这个题目们,感觉就不存好意。。。

然后开始开 \(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:

这个就是要求:

\[\sum_{i=1}^n(-1)^{\sum_{j=1}^md(i*j)}
\]

的值。

然后我们发现这个 \(1\) 的正负只和 \(\sum_{j=1}^md(i*j)\) 有关

所以我们只需要知道这个东西的奇偶性就可以了

我们发现对于一个数,他的约数中如果含有完全平方数,那么它的约数个数就不是奇数,所以我们就可以开始筛出完全平方数的数量。

我们对于 \(i\) 可以将其拆成 \(p*x^2\) 的形式,然后 \(j\) 也可以拆成 \(p*y^2\) 的形式。

我们只需要线性筛出即可。

[考试总结]noip模拟13的更多相关文章

  1. 5.23考试总结(NOIP模拟2)

    5.23考试总结(NOIP模拟2) 洛谷题单 看第一题第一眼,不好打呀;看第一题样例又一眼,诶,我直接一手小阶乘走人 然后就急忙去干T2T3了 后来考完一看,只有\(T1\)骗到了\(15pts\)[ ...

  2. 6.17考试总结(NOIP模拟8)[星际旅行·砍树·超级树·求和]

    6.17考试总结(NOIP模拟8) 背景 考得不咋样,有一个非常遗憾的地方:最后一题少取膜了,\(100pts->40pts\),改了这么多年的错还是头一回看见以下的情景... T1星际旅行 前 ...

  3. 5.22考试总结(NOIP模拟1)

    5.22考试总结(NOIP模拟1) 改题记录 T1 序列 题解 暴力思路很好想,分数也很好想\(QAQ\) (反正我只拿了5pts) 正解的话: 先用欧拉筛把1-n的素数筛出来 void get_Pr ...

  4. 2021.9.17考试总结[NOIP模拟55]

    有的考试表面上自称NOIP模拟,背地里却是绍兴一中NOI模拟 吓得我直接文件打错 T1 Skip 设状态$f_i$为最后一次选$i$在$i$时的最优解.有$f_i=max_{j<i}[f_j+a ...

  5. [考试总结]noip模拟23

    因为考试过多,所以学校的博客就暂时咕掉了,放到家里来写 不过话说,vscode的markdown编辑器还是真的很好用 先把 \(noip\) 模拟 \(23\) 的总结写了吧.. 俗话说:" ...

  6. 「考试」noip模拟9,11,13

    9.1 辣鸡 可以把答案分成 每个矩形内部连线 和 矩形之间的连线 两部分 前半部分即为\(2(w-1)(h-1)\),后半部分可以模拟求(就是讨论四种相邻的情况) 如果\(n^2\)选择暴力模拟是有 ...

  7. 2021.9.13考试总结[NOIP模拟52]

    T1 路径 考虑每一位的贡献,第$i$位每$2^i$个数会变一次,那么答案为$\sum_{i=1}^{log_2n} \frac{n}{2^i}$. $code:$ 1 #include<bit ...

  8. 2021.8.13考试总结[NOIP模拟38]

    T1 a 入阵曲.枚举矩形上下界,之后从左到右扫一遍.用树状数组维护前缀和加特判可以$A$,更保险要脸的做法是双指针扫,因为前缀和单调不减. $code:$ 1 #include<bits/st ...

  9. 6.11考试总结(NOIP模拟7)

    背景 时间分配与得分成反比,T1 20min 73pts,T2 1h 30pts,T3 2h 15pts(没有更新tot值,本来应该是40pts的,算是本次考试中最遗憾的地方了吧),改起来就是T3比较 ...

随机推荐

  1. Lombok——一款Java构建工具,“懒人”必备!!(idea版)

    一.简介 Lombok 是一种 Jav 构建工具,可用来帮助开发人员消除 Java 的冗长代码,尤其是对于简单的 Java 对象(POJO).它是通过注解实现这一目的. 二.使用 1.在idea中安装 ...

  2. Netty 框架学习 —— ByteBuf

    概述 网络数据的基本单位总是字节,Java NIO 提供了 ByteBuffer 作为它的字节容器,但这个类的使用过于复杂.Netty 的 ByteBuf 具有卓越的功能性和灵活性,可以作为 Byte ...

  3. Spring Boot 实战:如何自定义 Servlet Filter

    1.前言 有些时候我们需要在 Spring Boot Servlet Web 应用中声明一些自定义的 Servlet Filter来处理一些逻辑.比如简单的权限系统.请求头过滤.防止 XSS 攻击等. ...

  4. HashMap 中7种遍历方式的性能分析

    随着 JDK 1.8 Streams API 的发布,使得 HashMap 拥有了更多的遍历的方式,但应该选择那种遍历方式?反而成了一个问题. 本文先从 HashMap 的遍历方法讲起,然后再从性能. ...

  5. To_Heart—题解——AT2165

    这是一篇解题报告 首先,看到标签,考虑二分答案. 我们二分答案(即塔顶的值),把大于或等于这个值的变为1,否则变为0. 很容易发现,如果塔顶的答案是1,那么就说明值可以更大,否则相反. 复制一波样例 ...

  6. web自动化之windows页面切换

    一.为什么切换windows页面 在页面操作过程中,存在点击某个元素之后会重新打开一个windows页面,如果不切换至新页面的话,无法在新页面中进行操作,程序会出现报错 二.如何切换 1.获取当前所有 ...

  7. Java数据库开发(三)之——补充

    一.SQL注入与防范 使用PreparedStatement替代Statement对象,它提供了参数化SQL的方式 二.事务 定义 事务是并发控制的基本单位,满足ACID特征 原子性:atomicit ...

  8. Spring WebFlux快速上手——响应式Spring的道法术器

    https://blog.csdn.net/get_set/article/details/79480233

  9. 使用Flyway来管理数据库版本

    使用Flyway来管理数据库版本 Flyway是什么 Flyway是一款数据库迁移(migration)工具. 它可以帮助我们在不同环境保持数据库的同步,减少手工操作,避免数据导入的顺序错误,同时也减 ...

  10. Robotframework学习笔记之一Common Resource导入的Library库显示红色(导入失败)

    第一次使用Robotframework,所以也遇到了很多的坑,导入项目后 ,一些自带的库显示红色,导入失败!(ps:自带的库也显示红色) Ride日志如下(Tools--view ride log): ...