ACM-ICPC 2018 沈阳赛区网络预赛 K(找规律)

本文探讨了SupremeNumber的定义及其求解方法。SupremeNumber是由特定数字组成的质数,且其所有子序列也是质数。文章通过分析数字构成规律,提出了一种预处理策略,用于快速查找不超过给定数值的最大SupremeNumber。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Supreme Number

问题分析

题意:我们称,类似于由1和7组成的 n=17 n = 17 ,并且子序列也都是质数的数为 SupremeNumber S u p r e m e N u m b e r ,求不超过 N N 的最大SupremeNumber
题解:可以看出这样的数只能由 1,2,3,5,7 1 , 2 , 3 , 5 , 7 组成,我的方法就是。。暴力打表,发现这样的数最大不会超过四位,预处理出来枚举即可。
官方题解:由于任意两个不为 1 1 的数字构成的两位数一定可以被11整除,所以答案在除 1 1 以外的数字只能出现一次;1最多出现两次,因为 111 111 可以被 3 3 整除;而2,5,7三者一点不会有两者同时出现。因此满足条件的整数不会超过四位。

代码

#include <bits/stdc++.h>
typedef long long LL;
const int N = 1e3+10;
char s[N];
int ans[50] = {1,2,3,5,7,11,13,17,23,31,37,53,71,73,113,131,137,173,311,317};
int main()
{
        int T,w = 0;
        scanf("%d", &T);
        while(T--) {
                scanf("%s", s);
                int num = 0, k = 0, ret = 0;
                do {
                        int t = s[k++]-'0';
                        num = num*10 + t;
                        if(k >= 4||num>=317) {
                                ret = 317;
                                break;
                        }
                } while(s[k]);
                int i;
                for(i = 0; ans[i] <= 317 && ans[i]; ++i) {
                        if(num < ans[i]) {
                                ret = ans[i-1];
                                break;
                        }
                }
                if(ans[i] == 0) {
                        ret = 317;
                }
                printf("Case #%d: %d\n",++w,ret);
        }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值