2019年第十届蓝桥杯决赛(国赛) C++大学A组 D题 序列求和【全网找不到的题解?】
题面
试题 D: 序列求和
本题总分:10 分
【问题描述】
学习了约数后,小明对于约数很好奇,他发现,给定一个正整数 t,总是可以找到含有 t 个约数的整数。小明对于含有 t 个约数的最小数非常感兴趣,并把它定义为 S t S_t St。
例如 S 1 = 1 S_1 = 1 S1=1, S 2 = 2 S_2 = 2 S2=2, S 3 = 4 S_3 = 4 S3=4, S 4 = 6 S_4 = 6 S4=6,· · · 。
现在小明想知道,前 60 个 S i S_i Si 的和是多少?即 S 1 S_1 S1 + S 2 S_2 S2 + · · · + S 60 S_{60} S60 是多少?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
思路
在网上找了半天都没有这题的正确题解,决赛A组的填空题都没人写题解?好吧,然而我也不会,写了个暴力,打表到50就不行了,看来答案至少到long long了。
请教了搞数学的队友yz @yingyingying002(yz tql),告诉我直接dfs搜索,分解数求值。
举个例子,求因子数为12的最小数。
12 = 6 ∗ 2 ; a n s = 2 5 ∗ 3 1 12 = 6*2;ans=2^5*3^1 12=6∗2;ans=25∗31
= 3 ∗ 2 ∗ 2 ; a n s = 2 2 ∗ 3 1 ∗ 5 1 = 3*2*2;ans=2^2*3^1*5^1 =3∗2∗2;ans=22∗31∗51
= 4 ∗ 3 ; a n s = 2 3 ∗ 3 2 = 4*3;ans=2^3*3^2 =4∗3;ans=23∗32
= 2 ∗ 2 ∗ 3 ; a n s = 2 2 ∗ 3 1 ∗ 5 1 = 2*2*3;ans=2^2*3^1*5^1 =2∗2∗3;ans=22∗31∗51
12有以上4种分解方法,每个乘数-1就是要求的数分解后的质数的幂次(唯一分解定理),接下来考虑如何分配这些幂次给质数使得数最小?显然贪心。我们看最后一种分解方法,12=2*2*3,将其降序排序,3,2,2,再减一为2,1,1,那么显然 2 2 ∗ 3 1 ∗ 5 1 2^2*3^1*5^1 22∗31∗51能够让数尽量小并且满足因子数为12。
最后,我们dfs搜出所有的分解情况,然后其中最小的数。
另外,特判因子数为质数,比如因子数是13,减一是12,这个幂次全部分配给2,能得到的最小数是212,满足因子数是13。
代码
#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
const ll N=1e5,inf=1e18;
bool vis[N+10];
ll prime[N+10],tot=0,mi;
void get_prime() // 素数筛
{memset(vis,1,sizeof(vis));vis[0]=vis[1]=0;for(int i=2;i<=N;i++){if(vis[i])prime[tot++]=i;for(int j=0;j<tot&&i*prime[j]<=N;j++){vis[i*prime[j]]=0;if(i%prime[j]==0)break;}}
}
ll qpow(ll a,ll b) // 快速幂
{ll s=1;while(b){if(b&1)s=s*a;b/=2;a*=a;}return s;
}
ll dfs(ll x,vector<ll>g) // 将x分解成若干个数的乘积
{if(vis[x]||x==1)return qpow(2,x-1); // 特判质数和1for(ll i=2;i*i<=x;i++){if(x%i==0){ll t=x/i; // 大的那个数 g.push_back(i);// 更新mi vector<ll>tmp=g;tmp.push_back(t); sort(tmp.begin(),tmp.end(),greater<ll>());ll s=1;for(int j=0;j<tmp.size();j++)s*=qpow(prime[j],tmp[j]-1); mi=min(mi,s);dfs(t,g);g.pop_back();}}return mi;
}
int main()
{ios::sync_with_stdio(false);get_prime();ll ans=0;vector<ll>g;for(int i=1;i<=60;i++){mi=inf;g.clear();ll ts=dfs(i,g);ans+=ts;//printf("i=%d ts=%lld ans=%lld\n",i,ts,ans);}printf("%lld\n",ans);return 0;
}
答案:292809912969717649
2019年第十届蓝桥杯决赛(国赛) C++大学A组 D题 序列求和【全网找不到的题解?】相关推荐
- 第九届蓝桥杯(省赛)C++C组真题题解
文章目录 题目链接 C组真题(剩余题目同B组真题相同,已给出B组真题题目链接) 题目结构 第一题 哪天返回 第二题 猴子分香蕉 第五题 书号验证 第六题 稍小分数 第七题 次数差 第八题 等腰三角形 ...
- 第十届蓝桥杯单片机国赛代码实现
代码如下: #include <STC15F2K60S2.H> #include "iic.h" #include "onewire.h" #inc ...
- [蓝桥杯解题报告]第十届蓝桥杯大赛省赛(软件类)真题C++A组 Apare_xzc
蓝桥杯第十届省赛软件类C++A组解题报告 Apare_xzc 2020/2/13 考生须知 A. 平方和(5分) 分析: 这个题就是简单的模拟.只要循环一遍,判断每个数是否含有2019,然后平方相加即 ...
- 第十届蓝桥杯(国赛)——大胖子走迷宫
题目描述 小明是个大胖子,或者说是个大大胖子,如果说正常人占用 1×11 × 11×1 的面积,小明要占用 5×55 × 55×5 的面积. 由于小明太胖了,所以他行动起来很不方便.当玩一些游戏时,小 ...
- 第十届蓝桥杯(国赛)——拼接
问题描述 小明要把一根木头切成两段,然后拼接成一个直角. 如下图所示,他把中间部分分成了 n × n n × n n×n 的小正方形,他标记了每个小正方形属于左边还是右边. 然后沿两边的分界线将木头切 ...
- 第六届蓝桥杯大赛省赛C语言B组-填空题-星系炸弹(Java实现)
星系炸弹 在X星系的广袤空间中漂浮着许多X星人造"炸弹",用来作为宇宙中的路标. 每个炸弹都可以设定多少天之后爆炸. 比如:阿尔法炸弹2015年1月1日放置,定时为15天,则它在2 ...
- 第六届蓝桥杯大赛省赛C语言B组-填空题-奖券数目(Java实现)
奖券数目 有些人很迷信数字,比如带"4"的数字,认为和"死"谐音,就觉得不吉利. 虽然这些说法纯属无稽之谈,但有时还要迎合大众的需求.某抽奖活动的奖券号码是5位 ...
- 南林蓝桥杯计算机大赛,我院计算机系在2019年第十届蓝桥杯大赛(省赛)中获得5项一等奖...
我院计算机系在2019年第十届蓝桥杯大赛(省赛)中获得5项一等奖 在刚刚结束的2019年第十届蓝桥杯全国软件和信息技术专业人才大赛(省赛)中,我院计算机系获得了5项一等奖. 软件和信息技术产业作为我国 ...
- 2019年第十届蓝桥杯 - 省赛 - C/C++研究生组 - G. 扫地机器人
2019年第十届蓝桥杯 - 省赛 - C/C++研究生组 - G. 扫地机器人 Ideas 首先我们根据数学常识可以知道,当每个机器人清扫的范围差不多时,最好都是 N / K,花的时间应该是最少的. ...
最新文章
- [精选]MySQL的各种锁(表锁,行锁,悲观锁,乐观锁,间隙锁,死锁)
- 聚类 高维聚类 聚类评估标准 EM模型聚类
- 关于Ubuntu20.04 sudo vi找不到命令解决方法
- 直接插入排序python实现
- rtems 4.11 RTC驱动 (arm, beagle)
- 基于numpy的多项式拟合预测人口数值
- App Engine中的Google Services身份验证,第2部分
- C# 转繁体转简体转拼音,超级文本大转换
- STL中的序列式容器——deque(双端队列)
- Spring入门之bean的配置
- vios support for power
- 【Unity3D--自由观察模型】模型自动旋转+触屏旋转和缩放
- maxcomputer内建函数按字母排序
- 组织机构代码和统一社会信用代码校验规则以及java校验工具类
- 计算机会计实务好学吗,会计电算化难吗
- 响铃:抖音的敌人不是快手
- excel中插入文档
- Oracle 表字段的创建、删除、修改、查询
- Git提交指定的文件
- 移动端行驶证、驾驶证识别OCR—移动互联神器