洛咕11月月赛部分题解 By cellur925
听说是你谷史上最水月赛?我不听我最菜
T1:终于结束的起点 月天歌名好评
给你一个模数 \(M\),请你求出最小的
\(n > 0\),使得\(fib(n)\) \(mod\) \(m=0\),\(fib(n+1)\) \(mod\) \(m=1\)。
数学题,开始还想打表验证下,但是我不会告诉你我打表的时候没有很及时地取膜,然后中间有结果溢出,耽误了很长时间,企图找了很久规律。结果发现暴力就能过。hhh。
这个故事告诉我们要及时取膜!
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
ll m;
ll f[7000001];
int main()
{
scanf("%lld",&m);
f[0]=0;f[1]=1;
for(ll i=2;;i++)
{
(f[i]=f[i-1]+f[i-2])%=m;
if(f[i-1]==0&&f[i]==1)
{
printf("%lld\n",i-1);
return 0;
}
}
return 0;
}
T2:跳跳!
对于\(20\)%的数据,直接全排列枚举。
对于\(50\)%的数据,开始还想状压一下,结果交后发现超时,是我自己傻了!!企图用\(O(2^n*n*2)\)过\(n<=20\)!!!其实是四亿hhh。
本来还觉得自己想不出正解了,但是\(Mathison\)巨佬说他\(O(n)\)写出了...然后自己又冷静分析了下,发现是个非常简单的贪心==。
可以重构一个序列:先对原序列排序,每次先选择剩余序列中的最大值,再选最小值直到原序列为空。这个序列就是最优排列。
最后交的时候求稳分别交了全排列/状压/yy的正解,结果状压被卡T掉了30分:(。可能脸太黑了
这个故事告诉我们,一定算好时间复杂度!
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
int n,fake,tot;
ll ans,f[1200000][25];
int h[1000],a[100],b[100];
int seq[1000],tmp[1000];
void review()
{
ll qwq=0;
for(int i=1;i<=n;i++)
qwq+=1ll*(h[a[i-1]]-h[a[i]])*(h[a[i-1]]-h[a[i]]);
ans=max(ans,qwq);
}
bool cmp(int a,int b)
{
return a>b;
}
void dfs(int x)
{
if(x==n+1)
{
review();
return ;
}
for(int i=1;i<=n;i++)
if(!b[i])
{
b[i]=1;
a[x]=i;
dfs(x+1);
b[i]=0;
a[x]=0;
}
}
int main()
{
scanf("%d",&n);
if(n<=10)
{
for(int i=1;i<=n;i++) scanf("%d",&h[i]);
dfs(1);
printf("%lld\n",ans);
return 0;
}
/* if(n<=20)
{
for(int i=0;i<n;i++) scanf("%d",&h[i]);
fake=(1<<n)-1;
for(int i=0;i<n;i++)
f[(1<<i)][i]=1ll*h[i]*h[i];
for(int i=0;i<=fake;i++)
for(int j=0;j<n;j++)//枚举当前在哪
{
if(!(i&(1<<j))) continue;
for(int k=0;k<n;k++)//枚举上一步在哪
{
if(k==j||!(i&(1<<k))) continue;
f[i][j]=max(f[i][j],f[i^(1<<j)][k]+1ll*(h[j]-h[k])*(h[j]-h[k]));
}
}
for(int i=0;i<n;i++) ans=max(ans,f[fake][i]);
printf("%lld\n",ans);
return 0;
}*/
else
{
for(int i=1;i<=n;i++) scanf("%d",&seq[i]);
seq[++n]=0;
sort(seq+1,seq+1+n,cmp);
int i=1,j=n;
while(tot<n)
{
tmp[++tot]=seq[j],j--;
tmp[++tot]=seq[i],i++;
}
for(int i=2;i<=n;i++)
ans+=1ll*(tmp[i]-tmp[i-1])*(tmp[i]-tmp[i-1]);
printf("%lld\n",ans);
}
return 0;
}
T3:咕咕咕
\(n<=20\)的数据范围让我从头到尾都以为是状压,并在这个思路上死磕了很久...最后手码前三个点搞到了30分hhh。
其实是可以想出一个\(O(4^n)\)的状压暴力的:枚举子集。首先我们确定对于状态\(i\),它的子集\(j\)一定在\(0\)~\(i\)中,若\(i\)&\(j\)==\(j\),那么可以确定\(j\)是\(i\)的子集。
没有写=w=,下面是lwz dalao的程序==
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#define MAXN 2147483647
#define ll long long
using namespace std;
const int mod=998244353;
int n,m;
ll sum;
int a[2001000];
ll f[2001000],p[20010000];
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
char s[30];
scanf("%s",s+1);
int ret=0;
for(int j=1;j<=n;j++)
ret+=(s[j]-'0')*(1<<n-j);
int x;
scanf("%d",&x);
a[ret]=x%mod;
}
f[0]=a[0];//f记录到状态的花费
p[0]=1;//p记录此状态出现的次数
for(int i=1;i<(1<<n);i++)
{
for(int j=0;j<i;j++)
if((i&j)==j){
p[i]+=p[j];//记录自己的次数
(f[i]+=f[j])%=mod;//加上子集的花费
}
(f[i]+=a[i]%mod*p[i]%mod)%=mod;//加上自己
}
printf("%lld\n",f[(1<<n)-1]%mod);
return 0;
}
正解其实是..数学题?我们完全抛开状压dp的限制,考虑最后的答案其实是可以统计每个带权状态所有可能出现的次数,再乘上最后的权值就行了。
而如何算出现的次数?考虑乘法原理:把这些状态看成中间状态,分别算从0到它的次数、它到满状态的次数,二者相乘。
"具有相同1/0个数的状态出现次数一样”,开始并不能发现这个性质:(。其实出现01的位置并不重要重要的是数量,所以我们可以预处理出每个方案的出现次数。
设\(f[i]\)为填\(i\)个1的方案数,设最后一次填了\(j\)个,那么\(f[i]+=f[i-j]*C(i,j)\)。其中\(j\)从1到\(i\)循环。
这个故事告诉我们,不要一条路走到黑,有时你觉得十分正确的算法方向也可能不是正解,要灵活啊\(qwq\)。而且要多膜膜,没坏处的。
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
ll moder=998244353;
int n,m;
char op[100];
ll val,ans,C[50][50],f[50];
void prework()
{
C[0][0]=1;C[1][1]=1;
for(int i=1;i<=20;i++) C[i][0]=1,C[i][i]=1;
for(int i=1;i<=20;i++)
for(int j=1;j<=i;j++)
(C[i][j]=C[i-1][j]+C[i-1][j-1])%=moder;
f[0]=1;
for(int i=1;i<=20;i++)
for(int j=1;j<=i;j++)
(f[i]=f[i]+f[i-j]*C[i][j])%=moder;
}
int main()
{
scanf("%d%d",&n,&m);
prework();
for(int i=1;i<=m;i++)
{
scanf("%s",op);
int cnt=0;
for(int j=0;j<n;j++)
if(op[j]=='1') cnt++;
scanf("%lld",&val);
(ans+=val*f[cnt]%moder*f[n-cnt]%moder)%=moder;
}
printf("%lld\n",ans);
return 0;
}
T4:不围棋
本想搞到10分的,我输出的是1 1 -1 -1;其实应该直接输出-1 -1.因为放到\((1,1)\)后,自己就没有“气”了。嘤。
洛咕11月月赛部分题解 By cellur925的更多相关文章
- 「P4996」「洛谷11月月赛」 咕咕咕(数论
题目描述 小 F 是一个能鸽善鹉的同学,他经常把事情拖到最后一天才去做,导致他的某些日子总是非常匆忙. 比如,时间回溯到了 2018 年 11 月 3 日.小 F 望着自己的任务清单: 看 iG 夺冠 ...
- 「P4994」「洛谷11月月赛」 终于结束的起点(枚举
题目背景 终于结束的起点终于写下句点终于我们告别终于我们又回到原点…… 一个个 OIer 的竞赛生涯总是从一场 NOIp 开始,大多也在一场 NOIp 中结束,好似一次次轮回在不断上演.如果这次 NO ...
- 「LuoguP4995」「洛谷11月月赛」 跳跳!(贪心
题目描述 你是一只小跳蛙,你特别擅长在各种地方跳来跳去. 这一天,你和朋友小 F 一起出去玩耍的时候,遇到了一堆高矮不同的石头,其中第 ii 块的石头高度为 h_ihi,地面的高度是 h_0 = 0 ...
- csu-2018年11月月赛Round2-div1题解
csu-2018年11月月赛Round2-div1题解 A(2191):Wells的积木游戏 Description Wells有一堆N个积木,标号1~N,每个标号只出现一次 由于Wells是手残党, ...
- csu-2018年11月月赛Round2-div2题解
csu-2018年11月月赛Round2-div2题解 A(2193):昆虫繁殖 Description 科学家在热带森林中发现了一种特殊的昆虫,这种昆虫的繁殖能力很强.每对成虫过x个月产y对卵,每对 ...
- 【LGR-070】洛谷 3 月月赛-官方题解
本次免费为大家提供[LGR-070]洛谷 3 月月赛的官方题解,点个赞再走呗! 代码就不上了,大家可以到别的博客上去找找!希望这篇博客能对你有所帮助!
- 洛谷11月月赛题解(A-C)
心路历程 辣鸡T3卡我1.5h题意,要不是最后nlh跟我解释了一下大样例估计这次是真凉透了.. A P4994 终于结束的起点 打出暴力来发现跑的过最大数据?? 保险起见还是去oeis了一波,然后被告 ...
- 洛谷 11 月月赛 I Div.2 A [Kubic] Addition 题解
Content 你有一个长度为 \(n\) 的序列 \(a\).你可以执行 \(n-1\) 次操作,每次操作中你可以选择一个位置 \(i\),并删除 \(a_i\) 和 \(a_{i+1}\),再在原 ...
- 洛谷10月月赛II题解
[咻咻咻] (https://www.luogu.org/contestnew/show/11616) 令人窒息的洛谷月赛,即将参加NOIp的我竟然只会一道题(也可以说一道也不会),最终145的我只能 ...
随机推荐
- oracle ORA-12514: TNS:listener does not currently know of service requested in connect descriptor
ORA-12514: TNS:listener does not currently know of service requested in connect descriptor 1.看看是不是监听 ...
- NLP数据集大放送,再也不愁数据了!【上百个哦】
奉上100多个按字母顺序排列的开源自然语言处理文本数据集列表(原始未结构化的文本数据),快去按图索骥下载数据自己研究吧! 数据集 Apache软件基金会公开邮件档案:截止到2011年7月11日全部公开 ...
- 我的.emacs文件,用于C/C++及shell编程。
1. [代码]我的.emacs文件,用于C/C++及shell编程.;;我的配置;;1.基本配置;;外观配置***************;;禁用启动画面(setq inhibit-startup-m ...
- ThinkPHP基础(1)
多层MVC模式 M:Model 数据模型层,负责数据操作 V:View 视图层,负责显示视图 C:Controller 控制器,实现业务逻辑 控制器访问及路由解析 通过url地址get参数找到指定的控 ...
- centos7搭建mysql-5.7.22主从复制
mysql7.7.22主从复制 本项目是根据真实环境搭建编写出文档,文档中的目录也是根据自己公司环境所创建.公司原来是一台服务器搭建的数据库(5.7.22),由于业务的扩展需要搭建一台从服务器,减轻主 ...
- C语言中的文件操作
按照字符的方式读取文件 按照行的方式读取文件 按照数据块的方式读取文件 按照格式化的方式读取文件 文件分类 记录文件:具有一定的结构记录组成,分为定长和不定长两种方式 流式文件:按照一个字符一个字符( ...
- 【Lintcode】104.Merge k Sorted Lists
题目: Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexit ...
- 浏览器关闭或刷新事件--window.onbeforeunload
window.onunload=function(){ //不可以阻止浏览器的刷新或者关闭 return false; } window.onbeforeunload=function(){ //可以 ...
- WPF 使用MultiBinding ,TwoWay ,ValidationRule ,需要注意的事项
当wpf使用multibinding时, 其内部的validaterule的value 是其多个Binding的值, 要根据情况去验证, 还有就是在做IMultiConverter的ConvertBa ...
- 跑monkey前开启/关闭下拉栏
@echo off cls title 别忘了跑monkey啊 :menu cls color 0A echo. echo 1.禁用systemui并重启 echo. echo 2.启用systemu ...