HDOJ7060 Separated Number
时间:2021-08-13
本文章向大家介绍HDOJ7060 Separated Number,主要包括HDOJ7060 Separated Number使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目链接
题意分析
考试的时候想到了按位分析 但是由于计算公式过于麻烦 所以就咕了
现在考虑一下按位分析怎么做
我们对于当前第\(i\)位可以做的贡献
假设分割之后它处在第\(j\)位上 那么他的贡献就是
\[d*10^j*num
\]
\(d\)表示第\(i\)位的数字 而\(num\)表示这样之后的划分方案数
所以接下来我们的任务就是如何计算\(num\)
①\(i+j<n\)
如果\(i+j<n\) 的话 那么由于我们最后最多划分成\(k\)段 所以考虑插板法 答案就是
\[\sum_{m=0}^{k-2}C_{n-j-2}^{m}
\]
②\(i+j=n\)
如果\(i+j=n\) 的话 那么由于我们最后最多划分成\(k\)段 所以考虑插板法 答案就是
\[\sum_{m=0}^{k-1}C_{n-j-1}^{m}
\]
对于\(i+j=n\) 我们可以直接计算入答案中
而对于\(i+j<n\) 我们可以采用倒序的方式不断累加 从而计算
\[\sum_{j=0}^{n-i-1}num=\sum_{j=0}^{n-i-1}\sum_{m=0}^{k-2}C_{n-j-2}^{m}
\]
那么关键问题就是如何计算\(\sum_{m=0}^{k-2}C_{n-j-2}^{m}\)以及\(\sum_{m=0}^{k-1}C_{n-j-1}^{m}\)
我们发现对应的格式是\(\sum_{i=0}^bC_a^i\)
所以 令
\[F(a,b)=\sum_{i=0}^bC_a^i
\]
同时 ,由于
\[C_{n+1}^m=C_{n}^m+C_{n}^{m-1}
\]
\[∴2F(a,b)=2C_a^0+2C_a^1+...+2C_a^b=C_a^0+C_{a+1}^1+...+C_{a+1}^{b}+C_{a}^{b}=C_{a+1}^0+C_{a+1}^1+...+C_{a+1}^{b}+C_{a}^{b}=F(a+1,b)+C_{a}^{b}
\]
所以我们可以得到一个线性的递推公式出来
\[F(a,b)=2F(a-1,b)-C_{a-1}^{b}
\]
这样的话就可以计算了
CODE:
#include<bits/stdc++.h>
#define M 1000611
using namespace std;
const long long mod=998244353;
int T,n,k;
char s[M];
long long ans,sum;
long long Pow[M],fac[M],inv[M];
long long Fa[M],Fb[M];
long long qpow(long long x,long long y)
{long long tmp=1;for(;y;y>>=1,x=x*x%mod) if(y&1) tmp=tmp*x%mod;return tmp;}
long long C(int x,int y)
{
if(x<y) return 0;
else return (fac[x]*inv[x-y]%mod)*inv[y]%mod;
}
int main()
{
// freopen("data.in","r",stdin);
scanf("%d",&T);
Pow[0]=fac[0]=inv[0]=1;
for(int i=1;i<=1000000;++i) Pow[i]=Pow[i-1]*10%mod;
for(int i=1;i<=1000000;++i) fac[i]=fac[i-1]*i%mod;
inv[1000000]=qpow(fac[1000000],mod-2);
for(int i=999999;i;--i) inv[i]=inv[i+1]*(i+1)%mod;
while(T--)
{
scanf("%d%s",&k,s+1);n=strlen(s+1);
sum=0;ans=0;
Fa[0]=1;Fb[0]=(k>=2 ? 1:0);
for(int i=1;i<=n;++i)
{
Fa[i]=(2*Fa[i-1]%mod-C(i-1,k-1)+mod)%mod;
Fb[i]=(2*Fb[i-1]%mod-C(i-1,k-2)+mod)%mod;
}
// for(int i=1;i<=n;++i) printf("%lld%c",Fa[i],(i==n ? '\n':' '));
// for(int i=1;i<=n;++i) printf("%lld%c",Fb[i],(i==n ? '\n':' '));
for(int i=n;i;--i)
{
if(i<n) sum=(sum+(Pow[n-i-1]*Fb[i-1]%mod))%mod;
ans=(ans+((Pow[n-i]*Fa[i-1]%mod+sum)%mod)*(s[i]-'0')%mod)%mod;
}
printf("%lld\n",ans);
}
return 0;
}
原文地址:https://www.cnblogs.com/tcswuzb/p/15138537.html
- 利用d3.js对QQ群资料进行大数据可视化分析
- 海量数据迁移之分区并行切分(r2笔记60天)
- 数据结构和算法——kd树
- shell脚本心得(r2笔记58天)
- C/C++——柔性数组
- 用shell脚本巧妙统计文件(r2笔记57天)
- MATLAB技巧——imshow多张图片
- MATLAB技巧——sort和sortrows函数
- Python对商品属性进行二次分类并输出多层嵌套字典
- 通过shell得到数据库中权限的脚本(r2笔记77天)
- 用Python实现PCA和MDA降维和聚类
- 通过shell解析dump生成parfile(r2笔记76天)
- Web Spider实战1——简单的爬虫实战(爬取"豆瓣读书评分9分以上榜单")
- 如何用R语言从网上读取多样格式数据
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 三. CSS layout(布局)
- 四. css 布局之 float
- Python+selenium 自动化-读取excel记录的脚本执行登陆操作实战演示
- 详细讲解!从JVM直到类加载器
- PyQt5 图形界面-实现按钮监听事件
- Python 技术篇-文件操作:文件的读取和写入
- Salesforce Javascript(一) Promise 浅谈
- Python 技巧篇-英文单词首字母大小写转换功能实例演示,字符串切片实现
- 5千字的SpringMVC总结,我觉得你会需要
- 【原创】Java并发编程系列36 | FutureTask
- React Hooks-useTypescript!
- spring-boot项目优雅的http客户端工具,真香!
- 人人都可以学会生存分析(学徒数据挖掘)
- 谈谈const跟Object.freeze()
- Java String类源码阅读笔记