人的记忆本来就是暧昧的,不值得信任。

前言

又是令人头疼的数学部分。。还是太菜了。。

晚上还有一场,当场裂开。

T1 工业题

解题思路

首先,这个题的暴力还是非常好像的,直接按照题目要求码就好了。

对于正解,主要思路是计算每一个 \(f(i,0)\) 和 \(f(0,i)\) 对于答案的贡献。

其实就像从某个点(假设是 \((i,j)\) )向 \((n,m)\) 走,并且仅能向右向上走。

显然,贡献就是 \(a^{m-j}\times b^{n-i}\times f(i,j)\times 方案数\)。

接下来的问题就是求方案数了,那么一共有 \(n+m-i-j\) 步,它们无论如何排列的结果都是一样的。

由于向上走一步其实是相同的操作,但是我们按照他们不同来算了,因此需要除去一些的排列,就是:

\[\dfrac{A_{n+m-i-j}^{n+m-i-j}}{A_{n-i}^{n-i}\times A_{m-j}^{m-j}}
\]

算出来就是:

\[\dfrac{(n+m-i-j)!}{(n-i)!\times (m-j)!}
\]

阶乘以及 a,b 的幂次方都是可以预处理出来的,至于除法直接逆元就好了。

注意,这里有个魔鬼细节:

在 0 行 0 列之间是无法转移下去的,但是 1 行 1 列是可以的,并且差距仅仅是行列数之间的差距,因此只需要一些 +1 和 -1 就好了。

另外,注意一下取 \(\bmod\) 。

code

#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read()
{
int x=0,f=1;
char ch=getchar();
while(ch>'9'||ch<'0')
{
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
const int N=3e5+10,mod=998244353;
int n,m,a,b,ans,jc[N<<1],s1[N],s2[N],af[N],bf[N];
void Jc_Init()
{
jc[0]=af[0]=bf[0]=1;
for(int i=1;i<=m+n;i++)
jc[i]=jc[i-1]*i%mod;
for(int i=1;i<=m;i++)
af[i]=af[i-1]*a%mod;
for(int i=1;i<=n;i++)
bf[i]=bf[i-1]*b%mod;
}
int ksm(int x,int y)
{
int sum=1;
while(y)
{
if(y&1) sum=sum*x%mod;
y>>=1;
x=x*x%mod;
}
return sum;
}
signed main()
{
n=read();
m=read();
a=read()%mod;
b=read()%mod;
for(int i=1;i<=n;i++)
s1[i]=read()%mod;
for(int i=1;i<=m;i++)
s2[i]=read()%mod;
Jc_Init();
for(int i=1;i<=n;i++)
ans=(ans+jc[n+m-i-1]*ksm(jc[m-1],mod-2)%mod*ksm(jc[n-i],mod-2)%mod*bf[n-i]%mod*af[m]%mod*s1[i]%mod)%mod;
for(int i=1;i<=m;i++)
ans=(ans+jc[n+m-i-1]*ksm(jc[m-i],mod-2)%mod*ksm(jc[n-1],mod-2)%mod*af[m-i]%mod*bf[n]%mod*s2[i]%mod)%mod;
printf("%lld",ans);
return 0;
}

T2 卡常题

解题思路

不难发现因为每一个 Y 方点都只有两条边,因此可以将 Y 方点当作边, X 方点当作点。

我们就得到了一个有 n 条边, n 个点的环套树,显然,它比一般的树多了一条边,怎么办呢???

直接拆掉就好了,就是直接拆掉。

又因为每一个 X 方点是可以间隔存在的,剩下的就类似于 没有上司的舞会 这道题了。

在两个断点处进行两边树形 DP 取最小值就好了。

树形 DP 时分别记录一下选与不选这个点的值就好了。

code

#include<bits/stdc++.h>
#define int long long
#define f() cout<<"Fuck"<<endl;
using namespace std;
inline int read()
{
int x=0,f=1;
char ch=getchar();
while(ch>'9'||ch<'0')
{
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
const int N=1e6+10;
int tot,head[N],ver[N<<1],nxt[N<<1];
int n,vh,vb,bk1,bk2,ans,h[N],b[N],val[N],f[N][2];
bool vis[N];
void add_edge(int x,int y)
{
ver[++tot]=y;
nxt[tot]=head[x];
head[x]=tot;
}
void dfs(int x,int fro)
{
if(vis[x])
{
bk1=x;
bk2=fro;
return ;
}
if(bk1||bk2) return ;
vis[x]=true;
for(int i=head[x];i;i=nxt[i])
if(ver[i]!=fro)
dfs(ver[i],x);
}
void solve(int x,int fro)
{
f[x][1]=val[x];
f[x][0]=0;
for(int i=head[x];i;i=nxt[i])
if(ver[i]!=fro&&!(ver[i]==bk1&&x==bk2)&&!(ver[i]==bk2&&x==bk1))
{
int to=ver[i];
solve(to,x);
f[x][1]+=min(f[to][0],f[to][1]);
f[x][0]+=f[to][1];
}
}
signed main()
{
n=read();
vh=read();
vb=read();
for(int i=1;i<=n;i++)
{
h[i]=read();
b[i]=read();
val[h[i]]+=vh;
val[b[i]]+=vb;
add_edge(h[i],b[i]);
add_edge(b[i],h[i]);
}
dfs(1,0);
solve(bk1,bk2);
ans=f[bk1][1];
solve(bk2,bk1);
ans=min(ans,f[bk2][1]);
printf("%lld",ans);
return 0;
}

T3 玄学题

解题思路

-1 的次幂是由 \(d(i\times j)\) 的个数决定的。

-1 的偶数次幂是 1 对于答案是没有影响的,因此我们只用考虑 \(d(i\times j)\) 为奇数的时候。

当且仅当 \(i\times j\) 是完全平方数的时候 \(d(i\times j)\) 的值才是奇数。

原因比较显然:约数就是二个数的积等于这个数;对于非平方数的数每一约数都有一个对应的约数。

接下来把 i 拆成 \(p\times q^2\)( p 没有平方因子)对于 j 一定有 \(p\times r^2\) 的形式。

因此,对于每一个符合条件的 j 就有 r 种取值也就是 \(\sqrt{\dfrac{m}{p}}\) 。

显然的,我们可以通过筛出所有的完全平方数进而求出 p 的值(求的过程类似于欧拉筛筛素数)。

code

#include<bits/stdc++.h>
#define int long long
#define f() cout<<"Fuck"<<endl;
using namespace std;
inline int read()
{
int x=0,f=1;
char ch=getchar();
while(ch>'9'||ch<'0')
{
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
const int N=1e7+10;
int n,m,ans,cnt,f[N],pri[N];
bool vis[N];
signed main()
{
n=read();
m=read();
vis[1]=true;
pri[++cnt]=1;
for(int i=2;i<=n;i++)
{
if(vis[i]) pri[++cnt]=i;
int temp=i*i;
for(int j=1;j<=cnt&&pri[j]*temp<=n;j++)
vis[pri[j]*temp]=true;
}
for(int i=1;i<=n;i++)
{
if(!vis[i]) continue;
for(int j=1;j*i<=n;j++)
if(!vis[j])
f[j*i]=j;
}
for(int i=1;i<=n;i++)
{
if(!f[i]) f[i]=1;
int temp=sqrt(m/f[i]);
if(temp&1) ans--;
else ans++;
}
printf("%lld",ans);
return 0;
}

7.13早考试总结(NOIP模拟13)[工业题·卡常题·玄学题]的更多相关文章

  1. HZOI20190906模拟39 工业,卡常,玄学

    题面:https://www.cnblogs.com/Juve/articles/11484209.html 工业: 推一个式子,AC 没有用组合数....推了2个多小时 我sbsbsbsbsbsbs ...

  2. [考试总结]noip模拟13

    因为最近考试频繁,所以咕掉了好长时间... 淦,刚说完又来一场... 先咕了,等以后有时间再写.... 回来了... 首先看到这个题目们,感觉就不存好意... 然后开始开 \(T1\). 只能蒻蒻地按 ...

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

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

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

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

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

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

  6. noip模拟12[简单的区间·简单的玄学·简单的填数]

    noip模拟12 solutions 这次考试靠的还是比较好的,但是还是有不好的地方, 为啥嘞??因为我觉得我排列组合好像白学了诶,文化课都忘记了 正难则反!!!!!!!! 害没关系啦,一共拿到了\( ...

  7. Noip模拟13 2021.7.13:再刚题,就剁手&&生日祭

    T1 工业题 这波行列看反就非常尴尬.....口糊出所有正解想到的唯独行列看反全盘炸列(因为和T1斗智斗勇两个半小时...) 这题就是肯定是个O(n+m)的,那就往哪里想,a,b和前面的系数分开求,前 ...

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

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

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

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

  10. NOIP模拟测试39,思维禁锢专场「工业题·玄学题·卡常题」

    工业题 题解 抱歉,题解没时间写了 代码 #include<bits/stdc++.h> using namespace std; #define ll long long #define ...

随机推荐

  1. 什么是ip协议一

    前言 两节结束,为网络底层系列做铺垫. 首先来看一张图: IOS有七层,但是我们可以简化层4层,ip属于传输层,可以说是非常重要,下面简单的做一个介绍. 正文 ip的介绍: 1.ip是tcp/ip 协 ...

  2. 【笔记】greatest/least函数&Round函数

    刷了一下力扣,发现有很多的函数是自己不清楚的,用了这些函数是比较容易得出结果的,不用自己费心去实现一些奇怪的东西 1.最大最小值 链接:https://leetcode.cn/problems/num ...

  3. Stable Diffusion中的常用术语解析

    Stable Diffusion中的常用术语解析 对于很多初学者来说,会对Stable Diffusion中的很多术语感到困惑,当然你不是唯一的那个. 在这篇文章中,我将会讲解几乎所有你在Stable ...

  4. Spring Boot Serverless 实战 | Serverless 应用的监控与调试

    ​简介:Spring Boot 是基于 Java Spring 框架的套件,它预装了 Spring 的一系列组件,让开发者只需要很少的配置就可以创建独立运行的应用程序.在云原生的环境中,有大量的平台可 ...

  5. WPF 切换主题使用 luna 复古版本

    本文告诉大家如何在 WPF 里面使用 luna 等复古主题 今天在 lsj 说他准备优化 WPF 的程序集时,准备删除 luna 等程序集时,找到了一段有趣的注释,发现在 WPF 里面可以通过一些有趣 ...

  6. 【Flink入门修炼】2-3 Flink Checkpoint 原理机制

    如果让你来做一个有状态流式应用的故障恢复,你会如何来做呢? 单机和多机会遇到什么不同的问题? Flink Checkpoint 是做什么用的?原理是什么? 一.什么是 Checkpoint? Chec ...

  7. ADV7123驱动VGA显示色条

    VGA显示色条-基于ADV7123 用ADV7123代替权电阻网络,执行数模转换,差别在于rgb都变成8位,显示的色彩更多.控制端口多了3个:像素时钟,复合同步信号(不用就置0),消隐信号. 相对权电 ...

  8. 006_Orcad创建Hetergeneous分裂元件

    006_Orcad创建Hetergeneous分裂元件 以169脚的EMMC为例: 分为两部分,用到的引脚和NC的引脚. 先画一个框,依据引脚功能添加引脚.A部分做好,做B部分.引脚多,可以用pin ...

  9. 深入理解 C++ 中的多态与文件操作

    C++ 多态 多态(Polymorphism)是面向对象编程(OOP)的核心概念之一,它允许对象在相同操作下表现出不同的行为.在 C++ 中,多态通常通过继承和虚函数来实现. 理解多态 想象一个场景, ...

  10. 羽夏看Linux内核——简述

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.如有好的建议,欢迎反馈.码字不易,如果本篇文章有帮助你的,如有闲钱,可以打赏支持我的创作.如想转载,请把我的转载信息附在文章后面,并 ...