Educational Codeforces Round 84 (Rated for Div. 2)   比赛人数13522

[codeforces 1327E]  Count The Blocks    打表找规律+根据规律找公式+优化公式

总目录详见https://blog.csdn.net/mrcrack/article/details/103564004

在线测评地址https://codeforces.ml/contest/1327/problem/E

Problem Lang Verdict Time Memory
E - Count The Blocks GNU C++11 Accepted 78 ms 6100 KB

首次能在赛后独立AC掉E题,可喜可贺。

以下为AC代码,若读者看不懂,请慢慢看代码的由来

#include <stdio.h>
#define maxn 200010
#define LL long long
#define mod 998244353
LL a[maxn],pow[maxn],sum[maxn],A[maxn];
int main(){int n,i,j;scanf("%d",&n);pow[0]=1;for(i=1;i<=n;i++)pow[i]=pow[i-1]*10%mod;a[1]=10,sum[1]=10,A[1]=0;for(i=2;i<=n;i++){a[i]=i*pow[i]%mod;a[i]=((a[i]-sum[i-1]*i+A[i-1])%mod+mod)%mod;sum[i]=(sum[i-1]+a[i])%mod,A[i]=(A[i-1]+a[i]*(i-1)%mod)%mod;}for(i=n;i>=2;i--)printf("%lld ",a[i]);printf("%lld\n",a[1]);return 0;
}

拿到题目,想着就是排列组合的问题,n=1,n=2一想就通,n=3,n=4,已经想不清楚了,成千上万的数据啊

没辙,而且空想的规律未必对,采用暴力打表,先看看数据是怎么样的,再从排列组合入手。

以下为打表代码

#include <stdio.h>
#define LL long long
LL cnt[15],l,r;//cnt[1]长度为1的块的数量,cnt[2]长度为2的块的数量
int n,st[15],a[15];
void count(int x){//统计x中不同块的数量int top=0,tot=1,i;while(x){//将x中,每一位上的数字取出st[++top]=x%10;x/=10;  }for(i=1;i<=n;i++)a[i]=0;//将n位数字,先设置为0a[n+1]=-1;//边界设置for(i=1;i<=top;i++)a[i]=st[i];//将分解出来的数字,复制到数组a中for(i=2;i<=n+1;i++)if(a[i]!=a[i-1]){cnt[tot]++;//统计x中不同块的数量tot=1;}else tot++;
}
int main(){int i;scanf("%d",&n);l=0,r=1;for(i=1;i<=n;i++)r=r*10;r--;//数值范围的有边界。for(i=0;i<=r;i++)count(i);for(i=1;i<n;i++)printf("%lld ",cnt[i]);printf("%lld\n",cnt[n]);return 0;
}

由打表代码获得的几组关键数据如下

1
102
180 103
2610 180 104
34200 2610 180 105
423000 34200 2610 180 106
5040000 423000 34200 2610 180 107
58500000 5040000 423000 34200 2610 180 108
666000000 58500000 5040000 423000 34200 2610 180 10

有了上面的数据,发现规律已经很明显了,都不用上排列组合,已经可以直接上手代码了,一开始想编O(n)代码,编不出,那就先编能满足上述数据规律的代码吧,编好后一看,是O(n^2)的代码,代码如下

#include <stdio.h>
#define maxn 200010
#define LL long long
#define mod 998244353
LL a[maxn],pow[maxn],sum[maxn];
int main(){int n,i,j;scanf("%d",&n);pow[0]=1;for(i=1;i<=n;i++)pow[i]=pow[i-1]*10%mod;a[1]=10;for(i=2;i<=n;i++){a[i]=i*pow[i]%mod;for(j=1;j<i;j++)a[i]=((a[i]-a[j]*(i-j+1)%mod)%mod+mod)%mod;}for(i=n;i>=2;i--)printf("%lld ",a[i]);printf("%lld\n",a[1]);return 0;
}

若看不懂代码,请看数据模拟如下

1
102
180 1000,01,02,......,97,98,99有100个数据,每个数据包含2个数字,总的数字个数是2*100
00,11,22,33,44,55,66,77,88,99有10个数据,每个数据包含2个数字,总的数字个数是10*2容斥原理180=2*100-10*23
2610 180 102610=3*1000-180*2-10*34
34200 2610 180 1034200=4*10000-2610*2-180*3-10*4

对公式进行优化

for(j=1;j<i;j++)a[i]=((a[i]-a[j]*(i-j+1)%mod)%mod+mod)%mod;可简化为for(j=1;j<i;j++)a[i]-a[j]*(i-j+1)计算其中的部分公式
for(j=1;j<i;j++)a[j]*(i-j+1)以i=4为例
for(j=1;j<4;j++)a[j]*(4-j+1)
可以拆成
for(j=1;j<4;j++)a[j]*4-a[j]*(j-1)a[j]*4
a[1]*4+a[2]*4+a[3]*4=(a[1]+a[2]+a[3])*4=sum[3]*4   令sum[i]=a[1]+a[2]+...+a[i]a[j]*(j-1)
a[1]*0+a[2]*1+a[3]*2=A[3]

以下为AC代码

#include <stdio.h>
#define maxn 200010
#define LL long long
#define mod 998244353
LL a[maxn],pow[maxn],sum[maxn],A[maxn];
int main(){int n,i,j;scanf("%d",&n);pow[0]=1;for(i=1;i<=n;i++)pow[i]=pow[i-1]*10%mod;a[1]=10,sum[1]=10,A[1]=0;for(i=2;i<=n;i++){a[i]=i*pow[i]%mod;a[i]=((a[i]-sum[i-1]*i+A[i-1])%mod+mod)%mod;sum[i]=(sum[i-1]+a[i])%mod,A[i]=(A[i-1]+a[i]*(i-1)%mod)%mod;}for(i=n;i>=2;i--)printf("%lld ",a[i]);printf("%lld\n",a[1]);return 0;
}

[codeforces 1327E] Count The Blocks 打表找规律+根据规律找公式+优化公式相关推荐

  1. CodeForces - 1327E Count The Blocks(组合数学)

    题目链接:点击查看 题目大意:给出一个 n ,表示出 0 ~ 10^n - 1 内的所有整数,且用前导零补齐,即所有的数长度都为 n ,规定连续的且数值相同的一段称为block,现在问对于每个 i ∈ ...

  2. mysql 左表为null_sql left join count 左表为空表的时候出现空行

    sql left join count 左表为空表的时候出现空行 mysql> CREATE TABLE `test`.`tab1` ( `id` INT NOT NULL AUTO_INCRE ...

  3. oracle分页查询加总数,oracle count 百万级 分页查询记要总数、总条数优化

    oracle count 百万级 分页查询记录总数.总条数优化 oracle count 百万级 查询记录总数.总条数优化 最近做一个项目时,做分页时,发现分页查询速度很慢,分页我做的是两次查询,一次 ...

  4. python找出素数_python找素数

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 注意:对正整数n,如果用2到n的平方根之间的所有整数去除,均无法整除,则n为质数 ...

  5. SQL数据库不用SQL语句能显示全表的内容_MySQL百万级数据库优化方案

    一.百万级数据库优化方案 1.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断 ...

  6. 【C++】找最大公约数、找最小公倍数(分数的通分、约分)、素数、合数、公因数

    文章目录 找最大公约数.找最小公倍数(分数的通分.约分) C++如何找最大公约数(约分)(最大公因数) C++如何找最小公倍数(通分) 应用-找连续区间内的最大公因数 应用-分数加减算法 素数.合数. ...

  7. 鱼找鱼阿虾找虾,KNN算法帮着乌龟找王八

    初识KNN KNN算法是<机器学习实践>这本书介绍的第一个分类算法,可见其地位非凡.虽然随着入行资历增长,可能会越来越看轻它,但这就是历练的必经之路,要想过此路,先得跨过它. KNN(K- ...

  8. 创新方法系列 如何找联系 符号化就是找数学中的等于==关系,遇到等号请留意

    创新离不开观察力   思考力  想象力三大力的支撑 找联系是科学中三大基本能力  观察力   思考力  想象力  中的最重要的观察力的体现, 创新方法系列  如何找联系 符号化就是找数学中的等于==关 ...

  9. springboot打包成jar包后找不到xml,找不到主类的解决方法

    springboot打包成jar包后找不到xml,找不到主类的解决方法 参考文章: (1)springboot打包成jar包后找不到xml,找不到主类的解决方法 (2)https://www.cnbl ...

最新文章

  1. 松江库卡机器人_上海高质量发展调研行|库卡机器人:为全球提供“松江创造”的产品...
  2. NTPDATE - no server suitable for synchronization found 修复
  3. Windows CE 6.0 安装顺序
  4. 调用Remoting的两种激活方式和以及因此而产生的三种.net Remoting对象
  5. 用javascript伪造太阳系模型系统
  6. DDD关键知识点整理汇总
  7. 【UOJ】67 新年的毒瘤 【BZOJ】1123 BLO
  8. 子图同构算法——Ullmann算法(1)不包含refine procedure的简单穷举算法。
  9. Python多线程参考资料
  10. .describe() python_Python实现ARMA模型
  11. std::vector内存清理
  12. 1.1 经典车间生产调度问题模型及其算法
  13. windows系统ftp服务器,Windows下使用的FTP服务器软件
  14. WiFi测试规范总结
  15. Python_从零开始学习_(27) 字符串
  16. Python爬虫企查查
  17. 前端实现轮播图的三种方法。
  18. teamviewer linux远程开机,Ubuntu远程管理(teamviewer)
  19. 不同网段间访问共享文件
  20. 通过海康SDK预览获取回调的PS流数据自己解析然后前端播放

热门文章

  1. opencv contrib模块 示例 WeChat qrcode微信二维码检测解码
  2. 无限店铺服务器,云服务器操作多店铺
  3. 分享三款能够将图片转化为文字的软件
  4. 团队协作工具在线白板如何操作?
  5. Smallest-width 限定符
  6. 《极速蜗牛》渲染时间
  7. 解密“抗风险神器”:量化中性是如何赚钱的
  8. 20、费用管理:从单据类型看业务
  9. Halcon算子:smallest_rectangle1()和smallest_rectangle2()
  10. 求英文版“会员卡的说明”