CROI R1
$CROI$ $R1$
今天参加了一场比赛,什么比赛呢?CROI。
CROI是什么呢? $Challestend$ $Rehtorbegnaro$ $OI$。总的来说就是我们机房的一些神仙出的题啦。
这篇文章没有密码...被你发现啦!
T1:Challestend and Hyperrectangle
一道特别神仙的题目。
题意概述一下:给出一个高维立方体的 $n$ 个边长,将它的表面刷上漆,再将它切成单位小块,求恰好有 $i$ 面被着色的小立方体个数,对998244353取模.$i \in [0,2n]$,$4<=n<=30000,1<=a_i<=2^{64}$.
不会做呀...本来是有一点想法的,就是从一二三维的简单情况开始,进行类比,推出来一个比较科学的式子(它甚至可以过一个比较大的样例),但是对于 $a<=2$ 的情况就会崩溃,而且小一点的数据里每个都有这种情况,所以最后也没有分了。还是讲一下思路:
一维:两个顶点,$a-2$个无色立方体;
二维:四个顶点,$2\times(a-2+b-2)$个棱上的点,$(a-2)(b-2)$个无色立方体;
三维:八个顶点,$4\times(a-2+b-2+c-2)$个棱上的点,$2\times((a-2)(b-2)+(a-2)(c-2)+(b-2)(c-2))$个面上的点,$(a-2)(b-2)(c-2)$个无色的;
一维二维的可能比较难想,在这里放个图:
这题比较玄学的一点就是怎么分辨 $n$ 维立方体的“面”,因为按照一般的思路来说,只有三维立方体才有“面”。不过通过看样例,可以发现这道题里的“面”指的就是 $n-1$ 维的空间啦。
T2:Challestend and Anarchy Heap
这道题还是比较简单的(虽然我没做出来)。
题意概述:将斐波那契数顺次插入一个二叉堆,比较函数是随机的,问每次插入后堆顶的期望值的和,对998244353取模。$T<=400,1<=n<2^{64}$
期望具有线性性,所以只要算出每个点作为堆顶的概率。虽然比较函数坏掉了,但是树的形态还是固定的。可以发现每次插入新数后,堆顶要么是新数,要么不变。考虑是新数的概率:新数运气超好,一路随机上来到了根,也就是$\frac{1}{2^{x}}$,(x=当前点离根节点的距离),其它情况下都继承原答案。递推可以做到 $O(N)$,但是显然跑不过,所以可以矩乘,由于深度不固定,还得分段矩乘,有一点难写。
T3:Challestend and Summation
挺好的一道题,专治多项式学傻。
对以下式子求值:$n<=1e7,m<=1000$,F是一个 $m$ 项多项式。
$\sum_{i=1}^n\sum_{j|i}F(j) \space (\%998244353)$
首先给大家表演一下多项式学傻的人的做法:
$\sum_{j=1}^n\frac{n}{j}\sum_{i=0}^{m-1}a_ij^i$
$\sum_{j=1}^n\frac{n}{j}\sum_{i=0}^{m-1}a_i\sum_{k=1}^jS(i,k)\binom{j}{k}k!$
$\sum_{j=1}^n\frac{n}{j}\sum_{i=0}^{m-1}a_i\sum_{k=1}^jS(i,k)\frac{j!}{k!(j-k)!}k!$
$\sum_{j=1}^n\frac{n}{j}\sum_{i=0}^{m-1}a_i\sum_{k=1}^mS(i,k)\frac{j!}{(j-k)!}$
$\sum_{i=0}^{m-1}a_i\sum_{k=1}^mS(i,k)\sum_{j=1}^n\frac{n}{j}\frac{j!}{(j-k)!}$
第二类斯特林太妙啦,可以将很大的幂指数换成好求很多的阶乘!没错我当时就是这么想的。
后来又想了一下才发现...画到第一步时已经是一个很显然的整除分块形式,只要能快速求出 $f$ 的前缀和即可。而通过一些函数知识可以得到,$m$ 次函数的前缀和是一个 $m+1$ 次的函数,所以插值即可。注意这里不能写 $m^2$ 的插值,要优化一下到 $m$.
# include <cstdio>
# include <iostream>
# define R register int
# define ll long long using namespace std; const int mod=;
const int maxn=;
int n,m,a[maxn],k;
int ans,sx[maxn],f[maxn],inv[maxn],x[maxn],y[maxn]; ll cal (ll x)
{
ll s=,ans=;
for (R i=;i<m;++i)
{
ans=(ans+1LL*a[i]*s)%mod;
s=s*x%mod;
}
return ans;
} ll qui (ll a,ll b)
{
ll s=;
while(b)
{
if(b&) s=s*a%mod;
a=a*a%mod;
b>>=;
}
return s;
} ll S (int v)
{
if(v<=m) return y[v];
ll ans=;
for (R i=;i<=m;++i)
ans=(ans+1LL*y[i]*sx[i]%mod*(1LL*f[v]*inv[v-i]%mod*f[v-i-]%mod*inv[v--m]%mod))%mod;
return ans;
} int main()
{
scanf("%d%d",&n,&m); k=m;
for (R i=;i<m;++i) scanf("%d",&a[i]);
for (R i=;i<=m;++i)
{
x[i]=i;
y[i]=cal(i);
y[i]=(y[i]+y[i-])%mod;
}
f[]=;
for (R i=;i<=n;++i) f[i]=1LL*f[i-]*i%mod;
inv[n]=qui(f[n],mod-);
for (R i=n;i>=;--i) inv[i-]=1LL*inv[i]*i%mod;
for (R i=;i<=k;++i)
{
sx[i]=;
for (R j=;j<=k;++j)
{
if(i==j) continue;
sx[i]=1LL*sx[i]*(x[i]-x[j]+mod)%mod;
}
sx[i]=qui(sx[i],mod-);
}
int l=,r;
while(l<=n)
{
r=n/(n/l);
ans=(ans+1LL*(n/l)*((S(r)-S(l-))%mod+mod)%mod)%mod;
l=r+;
}
printf("%d\n",ans);
return ;
}
C
T4:Challestend and the Second War against Duliu
一看题目就可以发现这道题“Duliu”的本质了。
简单的说:给定一个长度为 $n$ 的数列以及 $n$ 个观察者,每个观察者可以看到 $[l_i,r_i]$ 的一段区域,要求支持如下操作:
对数列区间加;查询一段编号连续的观察者所能看到的值的和;修改某个观察者的观察区域。
$n,m<=10^5$
这题能做?$O(N\sqrt{N}logN)$ 的做法其实不是特别难想,但是似乎会被卡常。另注:这题的最大难点在于读题。
刚刚听了题解,感觉学到了很多东西,原来分块可以做到 $O(\sqrt{N})$ 区间加,$O(1)$ 区间查询,实在是非常神奇。
那么这里先写抄一份正常解法:
首先考虑分块维护区间和,有一个比较巧妙的做法是对于每个块维护和,再对于每个点维护块内的前后缀和,这样就可以做到 $O(1)$ 区间查询了。如果直接把这个做法扩展到区间加上复杂度就崩了,因为每次要打很多的标记。考虑对于每个块维护一个delta,表示未下放的标记...但是每个点得到的标记的实际值和它的位置是有关的,所以这里有两个做法:1.差分;2.delta标记变为维护一个等差数列的首项和公差;再用这种巧妙的分块代替原先的树状数组,即可通过本题 $O(N\sqrt{N})$
下面是我的乱搞做法:
对于观察者序列分块,每个块内维护一个长度为 $n$ 的数组,每个位置上的值表示这个块内的观察者有多少能看到这个位置。修改时,对于每个块计算贡献;查询时,整块可以直接得到答案,散点暴力查询。修改观察区间则更简单,只需要在相应的块内做一些处理就可以了。这里需要一个区间修改的数据结构,选择树状数组。
这样做的问题在于每个操作之间的复杂度过于不平衡,所以用 a,b,c 表示三个操作的操作次数,m表示分块大小,得到下式:
$a\frac{N}{M}logN+b\frac{N}{M}+bMlogN+clogN$
这样就可以用...模拟退火得到最优的块大小!
---shzr
CROI R1的更多相关文章
- PP66 EEPPPPMM SSyysstteemm AAddmmiinniissttrraattiioonn GGuuiiddee 16 R1
※★◆●PP66 EEPPPPMM SSyysstteemm AAddmmiinniissttrraattiioonn GGuuiiddee 16 R1AApprriill 22001166Conte ...
- P6 EPPM Installation and Configuration Guide 16 R1 April 2016
P6 EPPM Installation and Configuration Guide 16 R1 April 2016 Contents About Installing and ...
- P6 EPPM 16 R1 文档和帮助系统
P6 EPPM 16 R1 文档和帮助系统 https://docs.oracle.com/cd/E74894_01/ http://docs.oracle.com/cd/E68202_01/clie ...
- P6 Professional Installation and Configuration Guide (Microsoft SQL Server Database) 16 R1
P6 Professional Installation and Configuration Guide (Microsoft SQL Server Database) 16 R1 May ...
- 位运算取第一个非0的位 r & (~(r-1))
Single Number III Given an array of numbers nums, in which exactly two elements appear only once and ...
- Intersoft Mobile Studio 2013 R1 SP1 Crack
Intersoft Mobile Studio 2013 R1 SP1 (iOS, Android & WinR) Leave a comment tweet inShare ...
- 洛谷3月月赛 R1 Step! ZERO to ONE
洛谷3月月赛 R1 Step! ZERO to ONE 普及组难度 290.25/310滚粗 t1 10分的日语翻译题....太难了不会... t2 真·普及组.略 注意长为1的情况 #include ...
- SDOI 2019 R1游记
$SDOI$ $2019$ $R1$游记 昨天才刚回来,今天就来写游记啦! Day -5: 做了一下去年省选的Day1,感觉很神仙. Day -4: 做了一下去年省选的Day2,感觉还是很神仙. Da ...
- SDOI2017 R1做题笔记
SDOI2017 R1做题笔记 梦想还是要有的,万一哪天就做完了呢? 也就是说现在还没做完. 哈哈哈我竟然做完了-2019.3.29 20:30
随机推荐
- log4j介绍
log4j.properties文件的三种加载方式 1.默认自动加载 满足以下条件时: 1).配置文件名为log4j.properties 2).在classpath根目录下(即resources根目 ...
- vue2.4+vue-cli+webpack history模式打包后 刷新404
开启HTML5 History Mode后,尤其需要server端的支持,官方文档里就有介绍:(传送门: https://router.vuejs.org/zh-cn/essentials/histo ...
- js 处理金额各个位数上的值
//金额处理 var number = 1234567.35; if (parseInt(number) == number) { var money = number.toString().spli ...
- java对程序的简单加密
File file = new File("oppo.in"); File file1 = new File("main.in"); GregorianCale ...
- iOS--------获取当前连接的WiFi以及IP地址
导入头文件 #import <ifaddrs.h>#import <arpa/inet.h>#import <SystemConfiguration/CaptiveNet ...
- Html富文本编辑器
本文推荐两款简单的富文本编辑器[KindEditor,NicEdit]用于获得所见即所得的编辑效果,本文仅供学习分享使用,如有不足之处,还请指正. 概述 这两款编辑器都是采用JavaScript编写, ...
- react 会员登录
会员登录在我们的好多项目中都有用到,比如在后台管理系统,它的第一步就需要你进行登录,还有在我们常见的京东.淘宝.网易云音乐等一系列的软件上面都需要进行登录. 下面我们直接上代码 fetch(url,{ ...
- python leetcode 字符串相乘
给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式. 示例 1: 输入: num1 = "2", num ...
- (python)数据结构---字符串
一.概述 由一个个字符组成的有序序列. 使用单引号.双引号.三引号引住的字符序列. 不可变.线性的数据结构. 二.字符串的相关操作 1.元素访问----下标 字符串是线性的数据结构,可以使用索引去访问 ...
- mac date命令详解
Mac下的date命令是BSD(Berkeley Software Distribution)系的,Linux下date命令是GNU(GNU's Not Unix)系,二者用法有一些区别. BSD并不 ...