信息学奥赛一本通 2082:【21NOIP提高组】报数 | 洛谷 P7960 [NOIP2021] 报数
admin
2024-01-19 20:17:05
0

【题目链接】

ybt 2082:【21NOIP提高组】报数
洛谷 P7960 [NOIP2021] 报数

【题目考点】

1. 筛法求质数

2. 因数

3. 数字拆分

4. 链表思想

【解题思路】

根据新的规则,任何一个十进制中某一位含有7的数字的倍数都不能报出来。
那么不能报出来的数字一定存在某一位是7的因数。
该题核心点为:如何判断一个数字的所有因数中,存在因数某一位是7。简单说成:判断某数字的因数中是否包含7。

解法1:枚举(70分)

has7函数:使用数字拆分的方法判断一个数字中是否有一位为7(是否包含7)。
设函数fac7,fac7(n)返回值表示n的因数中是否包含7。

  • 先枚举出n的所有因数,可以枚举所有满足i≤ni\le \sqrt{n}i≤n​的i,如果n能整除i,那么i及n/i都是n的因数。
  • 用has7函数判断n的因数中是否包含7,如果存在包含的情况,那么fac7函数返回true。如果不存在包含7的情况,返回false。

主函数中,对于每次输入的x,

  • 如果x的因数中包含7,那么输出-1。
  • 否则从x+1开始,不断判断后面的每个数字的因数中是否包含7。如果找到某个数字的因数中不包含7,那么就输出这个数字。

has7的复杂度为O(logn)O(log n)O(logn),fact7的复杂度为O(n⋅logn)O(\sqrt{n}\cdot log n)O(n​⋅logn),询问次数T最大为10510^5105,输入的x最大为10710^7107。极端情况下,要对每个数字判断一下它的因数中是否有7,复杂度为O(nn⋅logn)O(n\sqrt{n}\cdot log n)O(nn​⋅logn),在n达到10710^7107时,总运算次数一定会超过10810^8108,会超时。
实际情况,用该方法写出代码提交,可以得70分。

解法2:筛法(100分)

该问题要做10510^5105次的询问,如果预先确定了每个可能的数字的的因数中是否包含7,那么每次询问的复杂度为O(1)O(1)O(1)。
类比判断多次询问的数字是不是质数的问题,可以通过筛法求质数表,而后询问的方法来减少复杂度。本题也可以采用类似的筛法。

设数组fac7,fac7[i]表示数字i的因数中是否包含7,数组所有元素初值都为false。
显然fac7[1]为false,i从2开始循环到10710^7107

  • 如果fac7[i]为true,则略过。
  • 如果fac7[i]为false,那么使用has7函数判断数字i中是否某一位是7。如果是,那么对所有满足i≤107i\le 10^7i≤107的i的倍数j,都把fac7[j]设为true。

对于输入的x,如果x的因数包含7,即fac7[x]为真,那么输出-1。
否则,要输出x的下一个因数包含7的数字。如果在这里枚举x后的每个数字看其因数是否包含7,则复杂度过高。
这里可以设一个链式结构,设数组nextNot7,nextNot7[i]表示数字i的下一个因数不包含7的数字。该数组的值可以在做筛法的过程中生成,具体见代码注释。
在生成该数组后,x的下一个因数不包含7的数字就是nextNot7[x]
【注意】输入的x可以是10710^7107,而10710^7107是一个因数不包含7的数字,它的下一个因数不包含7的数字是100000011000000110000001,因此在做筛法时,最后一次循环时i应该是10000001,使得nextNot7[10000000]为10000001才可以。

【题解代码】

解法1:枚举(70分)

#include 
using namespace std;
bool has7(int n)//判断数字n的某一位中是否有数字7 
{for(int a = n; a > 0; a /= 10)//n都是正整数,可以用for循环 if(a%10 == 7)return true;return false;
}
bool fac7(int n)//判断数字n是否有因数中包含7 
{for(int i = 1; i*i <= n; ++i)if(n%i == 0 && (has7(i) || has7(n/i)))return true;return false;	
}
int main()
{int t, x, r;scanf("%d", &t);while(t--){scanf("%d", &x);if(fac7(x))printf("-1\n");else{for(r = x+1; fac7(r); ++r);//如果r因数中有7,就看下一个数字。直到找到一个因数中没有7的数字。 printf("%d\n", r);}}return 0;
}

解法2:筛法(100分)

#include 
using namespace std;
#define N 10000000
bool fac7[N+2];//fac7[i]:数字i的因数中某一位是否包含7 
int nextNot7[N];//lastNot7[i]:数字i向后找第1个因数中不包含7的数字 
bool has7(int n)//判断数字n的某一位中是否有数字7 
{for(int a = n; a > 0; a /= 10)//n都是正整数,可以用for循环 if(a%10 == 7)return true;return false;
}
void screen()//普通筛法 
{int lastNot7 = 1;//上一个因数中不包含7的数字 for(int i = 2; i <= N+1; ++i){if(fac7[i] == false)//如果还没有判断i{if(has7(i))//如果i中某一位包含7 { for(int j = i; j <= N; j += i)//i的所有倍数的因数中都包含7 fac7[j] = true;}else//确定i的因数不包含7 {nextNot7[lastNot7] = i;//lastNot7的下一个不包含7的数字是i lastNot7 = i;//lastNot7变为i }}}
}
int main()
{int t, x, i;screen();//筛法得到fac7scanf("%d", &t);while(t--){scanf("%d", &x);if(fac7[x])printf("-1\n");elseprintf("%d\n", nextNot7[x]);}return 0; 
}

相关内容

热门资讯

大夫山公益骑行约70KM 一直以来都有从佛山骑行到番禺大夫山的想法,只是差一个契机,值着99公益节“心动骑行”活动这个机会,终...
“知音湖北 发现美好” 湖北十... 9月5日,由湖北省文化和旅游厅主办的“知音湖北 发现美好”全媒体征集活动,正式揭晓“湖北十大热门避暑...
一场说走就走的北京之旅?这十家... 宝子们,是不是计划着来一场说走就走的北京之旅?但又担心旅行社不靠谱,踩坑无数?别慌,今天就给大家带来...
吉安井冈山烟笋烧肉:笋鲜肉香,... 吉安井冈山烟笋烧肉,是江西井冈山地区极具代表性的传统名菜,凭借笋的鲜嫩与肉的醇香完美融合,成为无数人...
月饼也有臭豆腐口味了?麦德龙:... 近日,一款“臭豆腐月饼”在社交平台引发热议。有网友发文称,这款月饼口味奇特,尝后觉得味道有些冲人。但...
香酥饼的奇幻之旅:9 款美味家... 今天咱们要开启一场香酥饼的奇幻之旅啦!这 9 款家常小饼,个个身怀绝技,不管是甜口还是咸口,都能满足...
适用人群更广泛!新一代抗失眠药... 9月5日,源自瑞士的新一代抗失眠药达利雷生(商品名:科唯可®),在山东大学齐鲁医院和山东第一医科大附...
五星酒店下场摆地摊!难道高端不... 文︱陆弃 五星级酒店开卖盒饭了?没错,不是豪华自助餐,也不是精致宴会,而是简简单单的盒饭,二十块左右...
为苏超“加游”!无锡牵手延安、... 本周末,苏超联赛无锡队主场对阵连云港队焦点战将在江阴体育中心打响。9月5日晚,延安、无锡、连云港三城...
2025新疆乌鲁木齐排名前十旅... 据网易旅游2025年最新信息显示,新疆乌鲁木齐作为丝绸之路核心区的旅游枢纽,每年吸引超3000万游客...
在古巴,看见另一种真实 关注吴大爷二三事,一起共同成长 知识分享 丨生活感悟 学习思考,寻找自我。 大家好,我是满肚子鸡汤的...
北京老人游避坑!好评前十的旅行... 家人们,家里有老人想要在北京游玩的可要注意啦!今天就给大家带来北京老人游好评前十的旅行社排行榜,让老...
懒人福音躺赢榜:这几家靠谱旅行... 家人们,是不是每次计划出游都被繁琐的行程安排和行李搬运搞得头大?尤其是带娃出行,简直就是一场“硬仗”...
7岁幼童被老虎咬伤,通报来了 ... 9月6日,雄森旅游度假区发布关于8月30日游客事件的通报,近日,我度假区“萌虎科普体验官”项目发生一...
外焦里糯超入味!家常香辣孜然年... 香辣孜然年糕是一道极具街头风味的家常小吃,外焦里糯,裹满浓郁的孜然香辣酱汁,一口下去越嚼越香。以下是...
宁波汤圆:黑芝麻馅流心,冬至必... 本文围绕宁波汤圆展开,详细介绍这道传统美食的独特魅力。首先概述宁波汤圆以黑芝麻流心馅为核心特色,是冬...
原创 这... 不知道吃什么的时候就简单研究个炖菜吃一吃吧,挑选几样冰箱中有的食材,简单一炖、简单调味,清清爽爽,有...
新疆米粉制作技艺入选非物质文化... 日前,新疆温暖十里(米粉阵)餐饮管理有限公司创始人、新疆米粉制作技艺非物质文化遗产传承人龚铭创新推出...
广西平南幼虎咬伤女童,场馆称已... 近日,一名7岁小女孩在广西平南县雄森动物大世界与小老虎近距离互动时,被其咬伤右腿。9月6日,南都N视...