[NOIP模拟测试34]反思+题解
不要陷入思维定势,如果长时间没有突破就要考虑更改大方向.
不要把简单问题复杂化.
做完的题就先放下,不管能拿多少分。不能过一段时间就回来调一下.
$Solutions:$
A.次芝麻
因为$n+m$始终为定值,所以可以发现每次操作相当与对$n$或$m$任意一个数在模$n+m$意义下$\times 2$,直接上快速幂。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,m,K;
ll qpow(ll a,ll b,ll mod)
{
ll res=1;
while(b)
{
if(b&1)res=res*a%mod;
a=a*a%mod;
b>>=1;
}
return res;
}
int main()
{
scanf("%lld%lld%lld",&n,&m,&K);
ll tot=n+m;
ll ans=n*qpow(2,K,n+m)%(n+m);
cout<<min(ans,tot-ans)<<endl;
return 0;
}
B.喝喝喝
$a\% b=K$-->$a-K=x\times b$
记录每一个数第一次出现的位置,对于每个$a[i]$枚举它的约数就可以更新坏对右端点,利用端点距离统计答案即可。注意特判。
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
typedef long long ll;
int read()
{
int x=0,f=1;char ch=getchar();
if(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch)){x=x*10+ch-'0',ch=getchar();}
return x*f;
}
const int N=1e5+5;
int a[N],n,K,b[N];
int main()
{
n=read();K=read();
for(int i=1;i<=n;i++)
a[i]=read();
ll ans=0;int maxx=0;
for(int i=1;i<=n;i++)
{
int pos=K>=a[i]?0:max(b[0],b[a[i]]);
maxx=max(maxx,pos);
ans+=i-maxx;
if(a[i]<K)continue;
int val=a[i]-K;
if(!val)
{
b[0]=i;
continue;
}
int sqt=sqrt(val);
for(int j=1;j<=sqt;j++)
if(val%j==0)b[j]=b[val/j]=i;
}
cout<<ans<<endl;
return 0;
}
C.长寿花
怎么这几天的T3都是不可做dp啊?
考虑每一层具体选哪些颜色显然是没有用的,所以直接设$f[i][j]$为第i层用j种颜色的方案数,发现只用组合数转移比较困难。再定义$g[i][j]$为i个位置放j种颜色,保证相邻位置颜色不同的方案数;也就是把i个元素放到j个集合里,且相邻两个元素不在同一集合的方案数。
可以递推求出$g[]$。对于$g[i][j]$来说,应当有两个转移来源:一是之前有i-1个元素,j个集合,这个新元素不创建新的集合,但也不能和之前那个的集合相同;二是之前有i-1个元素,j-1个集合,且这个新元素创建了一个新集合。
所以递推式为$g[i][j]=g[i-1][j]*(j-1)+g[i-1][j-1]*j$
关于系数:第一种情况新加的元素只能从它上一个元素所属的集合之外选集合,所以有$j-1$种;第二种情况的新元素有着船新的颜色,所以它的位置不受约束,可以有$j-1+1=j$种情况。
有了$g[]$,我们再统计一下$sum[i]=\sum f[i][j]$,$f[]$的转移也就十分简单了:$f[i][j]=sum[i-1] \times g[i][j] \times C_m^j -f[i-1][j] \times g[i][j]$
还有一件事QAQ,这里的模数不一定是质数,所以需要$exLucas$或者分解质因数。注意分解质因数维护质因子的桶时也要递推维护,不然复杂度就假了。当然统计答案爆扫就行。
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
typedef long long ll;
const int N=1e6+5;
int read()
{
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int n,m,p;
int a[N];
ll g[5005][5005],C[5005],f[2][5005],sum[N];
int pr[N],vis[N],res[N],tot,bu[N];
void getprime()
{
for(int i=2;i<=m;i++)
{
if(!vis[i])pr[++tot]=i,res[i]=tot;
for(int j=1;j<=tot;j++)
{
if(i*pr[j]>m)break;
vis[i*pr[j]]=1,res[i*pr[j]]=j;
if(i%pr[j]==0)break;
}
}
}
void dv(int x,int val)
{
while(x!=1)bu[res[x]]+=val,x/=pr[res[x]];
}
void getC()
{
dv(m,1);
C[1]=C[0]=1;
for(int i=1;i<=tot;i++)
if(bu[i])
for(int j=1;j<=bu[i];j++)
(C[1]*=pr[i])%=p;
for(int i=2;i<=5000;i++)
{
if(i>m)break;
dv(m-i+1,1);dv(i,-1);
C[i]=1;
for(int j=1;j<=tot;j++)
if(bu[j])
for(int k=1;k<=bu[j];k++)
(C[i]*=pr[j])%=p;
}
}
int main()
{
n=read();m=read();p=read();
for(int i=1;i<=n;i++)
a[i]=read();
getprime();
g[1][1]=1;
for(int i=2;i<=5000;i++)
for(int j=1;j<=i;j++)
g[i][j]=(1LL*g[i-1][j]*(j-1)%p+g[i-1][j-1]*j%p)%p;
getC();
int now=1,pre=0;
for(int i=1;i<=a[1];i++)
f[now][i]=g[a[1]][i]*C[i]%p,(sum[1]+=f[now][i])%=p;
for(int i=2;i<=n;i++)
{
now^=1;pre^=1;
memset(f[now],0,sizeof(f[now]));
for(int j=1;j<=m&&j<=a[i];j++)
{
f[now][j]=sum[i-1]*g[a[i]][j]%p*C[j]%p;
f[now][j]-=f[pre][j]*g[a[i]][j]%p;
while(f[now][j]<0)f[now][j]+=p;
(sum[i]+=f[now][j])%=p;
}
}
cout<<sum[n]<<endl;
return 0;
}
[NOIP模拟测试34]反思+题解的更多相关文章
- [NOIP模拟测试37]反思+题解
一定要分析清楚复杂度再打!!!窝再也不要花2h20min用暴力对拍暴力啦!!! 雨露均沾(滑稽),尽量避免孤注一掷.先把暴力分拿全再回来刚正解. 即使剩下的时间不多了也优先考虑认真读题+打暴力而非乱搞 ...
- [NOIP模拟测试32]反思+题解
又考挂了QAQ 总rank直接滑出前20 晚上考试脑子还算比较清醒,可惜都用来xjb乱想错误思路了. T1一眼推柿子,然而并没有头绪所以先码了个暴力.然后…… 一个垃圾暴力我调了1h,大概解决了两位数 ...
- 2019.8.1 NOIP模拟测试11 反思总结
延迟了一天来补一个反思总结 急匆匆赶回来考试,我们这边大家的状态都稍微有一点差,不过最后的成绩总体来看好像还不错XD 其实这次拿分的大都是暴力[?],除了某些专注于某道题的人以及远程爆踩我们的某学车神 ...
- 2019.7.29 NOIP模拟测试10 反思总结【T2补全】
这次意外考得不错…但是并没有太多厉害的地方,因为我只是打满了暴力[还没去推T3] 第一题折腾了一个小时,看了看时间先去写第二题了.第二题尝试了半天还是只写了三十分的暴力,然后看到第三题是期望,本能排斥 ...
- 2019.8.14 NOIP模拟测试21 反思总结
模拟测试20的还没改完先咕着 各种细节问题=错失190pts T1大约三分钟搞出了式子,迅速码完,T2写了一半的时候怕最后被卡评测滚去交了,然后右端点没有初始化为n…但是这样还有80pts,而我后来还 ...
- 2019.8.9 NOIP模拟测试15 反思总结
日常爆炸,考得一次比一次差XD 可能还是被身体拖慢了学习的进度吧,虽然按理来说没有影响.大家听的我也听过,大家学的我也没有缺勤多少次. 那么果然还是能力问题吗……? 虽然不愿意承认,但显然就是这样.对 ...
- 2019.8.3 NOIP模拟测试12 反思总结【P3938 斐波那契,P3939 数颜色,P3940 分组】
[题解在下面] 早上5:50,Gekoo同学来到机房并表态:“打暴力,打暴力就对了,打出来我就赢了.” 我:深以为然. (这是个伏笔) 据说hzoi的人还差两次考试[现在是一次了]就要重新分配机房,不 ...
- 2019.8.12 NOIP模拟测试18 反思总结
写个博客总是符合要求的对吧 回来以后第一次悄悄参加考试,昨天全程围观… 然后喜提爆炸120分wwwwwwwww T1用了全机房最慢的写法,导致改掉死循环T掉的一个点以后还是死活过不了最后一个点.T2全 ...
- 2019.8.10 NOIP模拟测试16 反思总结【基本更新完毕忽视咕咕咕】
一如既往先放代码,我还没开始改… 改完T1滚过来了,先把T1T2的题解写了[颓博客啊] 今天下午就要走了,没想到还有送行的饯别礼,真是欣喜万分[并没有] 早上刚码完前面的总结,带着不怎么有希望的心情开 ...
随机推荐
- AngularJS ng-model 指令
AngularJS ng-model 指令 ng-model 指令用于绑定应用程序数据到 HTML 控制器(input, select, textarea)的值. 代码示例如下: <!DOCTY ...
- Python游戏
要想实现键盘控制作用,就需要给游戏键盘监听事件利用pygame模块的key.get_pressed()方法,来检测按键是否按下 key_press =pygame.key.get_pressed() ...
- JS 提取公式中的参数
'A+B-C/D*E'.split(/[*/()+-]/) => [A,B,C,D,E]
- Centos7 安装配置Apache+Mysql5.7+PHP7.0+phpmyadmin
Centos7 下安装配置Apache+Mysql5.7+PHP7.0+phpmyadmin 搭建LAMP =========================================Apach ...
- 使用UI Automation实现自动化测试--5-7
使用UI Automation实现自动化测试--5 (Winfrom和WPF中弹出和关闭对话框的不同处理方式) 在使用UI Automation对Winform和WPF的程序测试中发现有一些不同的地方 ...
- Java开发用H2数据库
#JPA Configuration:#spring.jpa.database=MySQLspring.datasource.url=jdbc:h2:mem:jpaspring.datasource. ...
- [转] 一位ACMer过来人的心得
刻苦的训练我打算最后稍微提一下.主要说后者:什么是有效地训练? 我想说下我的理解.很多ACMer入门的时候,都被告知:要多做题,做个500多道就变牛了.其实,这既不是充分条件.也不会是必要条件. 我觉 ...
- 最新版WinRAR5.61去广告代码教程分享(仅供学习交流)
最新版WinRAR5.61去广告代码教程分享(仅供学习交流) 第一步:到WinRAR官网www.rarlab.com下载自己需要的版本,选择Chinese Simplified 64bit 安装即可. ...
- systemctl 相关命令
systemctl 相关命令:service,chkconfig systemd 是 Linux 下的一款系统和服务管理器,兼容 SysV 和 LSB 的启动脚本.systemd 的特性有:支持并行化 ...
- Codeforces 1198E Rectangle Painting 2 最小点覆盖(网络流)
题意:有一个n * n的棋盘,每个棋盘有某些矩形区域被染成了黑色(这些矩形区域有可能相交),问把所有黑色区域染成白色的最小花费是多少?你每次可以选择把一个矩形区域染成白色,花费是染色的矩形区域长和宽的 ...