航电“Yes, Prime Minister”

Yes, Prime Minister

Time Limit: 10000/10000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others)
Total Submission(s): 583    Accepted Submission(s): 228


https://acm.hdu.edu.cn/showproblem.php?pid=7025

Problem Description

Mr. Hacker's Department of Administrative Affairs (DAA) has infinite civil servants. Every integer is used as an id number by exactly one civil servant. Mr. Hacker is keen on reducing overmanning in civil service, so he will only keep people with consecutive id numbers in [l,r] and dismiss others. 

However, permanent secretary Sir Humphrey's id number is 
x and he cannot be kicked out so there must be lxr. Mr. Hacker wants to be Prime Minister so he demands that the sum of people's id number ri=li must be a prime number. 

You, Bernard, need to make the reduction plan which meets the demands of both bosses. Otherwise, Mr. Hacker or Sir Humphrey will fire you. 

Mr. Hacker would be happy to keep as few people as possible. Please calculate the minimum number of people left to meet their requirements.

A prime number 
p is an integer greater than 1 that has no positive integer divisors other than 1 and p. 

Input

The first line contains an integer T(1≤T≤106) - the number of test cases. Then T test cases follow.
The first and only line of each test case contains one integer 
xi(−107xi≤107) - Sir Humphrey's id number.

Output

For each test case, you need to output the minimal number of people kept if such a plan exists, output −1 otherwise.

Sample Input

10

-2

-1

0

1

2

3

4

5

6

7

Sample Output

6

4

3

2

1

1

2

1

2

1 

标签:素数筛+二分 

题意:在包含x的连续的连续区间内找到素数和最小的范围

思路:先用素数筛法将题目范围内的所有素数筛出来,分类:

        当x=0的时候,最小分为为0,1,2,ans=3;

        当x>0的时候,

                        如果x本身是素数,则ans=1,

                        如果x+x+1/x+x-1为素数,则ans=2,

                        如果还没有答案(这里是没有考虑到的地方,2*x+1/2*x-1不一定是素数,比如说x=11的时候,2*11-1=21=3*7),则向左到x轴负半轴延长到-x,那么此时x-x=0;现在需要找一个质数或者相邻的两个数的和为质数的数,“不妨找到第一个大于x的质数和第一个大于x且2*x+1为质数的数”,这里直接在数据范围内的所有素数中用二分查找找到满足要求的位置即可

        当x<0的时候,将范围延长至x,x-x=0,此时与👆🏻第三种的情况一样

补充:upper_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。

#include<bits/stdc++.h>
using namespace std;

const int lim=3e7+5;
const int maxn=7e7+5;//maxn要比lim大 
int vis[maxn],prime[maxn],prime2[maxn],tot,top;
//素数筛
void find()
{
    vis[1]=1;
    for (int i=2; i<lim; i++)
    {
        if (!vis[i]) prime[++tot]=i;
        for (int j=1;j<=tot&&i*prime[j]<lim;j++)
        {
            vis[i*prime[j]]=1;
            if (i%prime[j]==0)
                break;
        }
    }
    for (int i=1; i<=lim; i++)
    {
        if (!vis[2*i-1]) 
            prime2[++top]=i;
    }//保留2*i-1的素数
        
    return ;
}

int main()
{   
    find();//筛出范围内所有的素数
    int t,x;
    scanf("%d",&t);
    while (t--)
    {
        scanf("%d",&x);
        if (x==0) 
        { 
            printf("3\n");
            continue; 
        }//x=0:0,1,2
        if (x>0)
        {
            if (!vis[x]) 
            { 
                printf("1\n");
                continue; 
            }//本身是素数
            if (!vis[2*x+1]||!vis[x*2-1]) 
            { 
                printf("2\n");
                continue; 
            }//x+x+1/x+x-1是素数
            //如果还没有 往负数区域扩展到-x 这样x+(-x)抵消了 那么再往前找大于x的第一个素数(prime)和第一个大于x且2*x+1为素数的数(prime2)
            int ans=0x3f3f3f3f;//无穷大
            int pos=upper_bound(prime+1,prime+tot+1,x)-prime;
            ans=min(ans,prime[pos]*2);//
            pos=upper_bound(prime2+1,prime2+lim+1,x)-prime2;
            ans=min(ans,2*prime2[pos]-1);
            printf("%d\n",ans);
        }
        else if (x<0)
        {//x<0的时候 就和x/2*x+1/2*x-1都不是质数的情况一样
            x=-x;
            int ans=0x3f3f3f3f;
            int pos=upper_bound(prime+1,prime+tot+1,x)-prime;
            ans=min(ans,prime[pos]*2);
            pos=upper_bound(prime2+1,prime2+top+1,x+1)-prime2;//
            ans=min(ans,2*prime2[pos]-1);
            printf("%d\n",ans);
        }
    }
    return 0;
}

### 使用CNN卷积神经网络实现特定对象(如minister)图像识别的方法 #### 数据收集与准备 为了构建有效的CNN模型用于特定对象(例如minister)的识别,数据集的质量至关重要。需要大量标注好的包含目标对象的高质量图像作为训练样本。 - 收集尽可能多的不同角度、光照条件下的minister正面清晰照片。 - 对每一张图片进行标记,确保标签准确无误。 - 将数据划分为训练集、验证集和测试集三个部分[^1]。 #### 构建CNN架构 根据Nogueira等人提出的思路,可以采用预训练过的大型通用物体识别CNN模型并对其进行微调以适应特定任务需求。这有助于减少过拟合风险,并提高泛化能力。 ```python import torch from torchvision import models, transforms from torch.utils.data import DataLoader # 加载预训练ResNet50模型 model = models.resnet50(pretrained=True) # 替换最后一层全连接层为适用于新分类任务的新层 num_ftrs = model.fc.in_features model.fc = torch.nn.Linear(num_ftrs, num_classes) # 假设num_classes为目标类别数量 ``` #### 图像预处理 在输入到CNN之前,原始图像通常需要经过一系列标准化操作: - 调整大小至固定分辨率; - 应用颜色转换或增强技术增加多样性; - 归一化像素值范围使其适合网络权重初始化。 ```python transform = transforms.Compose([ transforms.Resize((224, 224)), # 统一调整尺寸 transforms.RandomHorizontalFlip(), # 随机水平翻转扩充数据集 transforms.ToTensor(), # 转换成PyTorch Tensor格式 transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) # 正则化参数来自ImageNet均值方差 ]) ``` #### 训练过程配置 设置合适的优化器、损失函数以及学习率调度策略对于获得良好收敛性和高效训练非常重要。 ```python criterion = torch.nn.CrossEntropyLoss() # 多类交叉熵损失函数 optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate) scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=7, gamma=0.1) # 学习率衰减计划 ``` #### 微调与评估 通过迁移学习的方式,在新的目标任务上继续训练已有的深层特征表示,从而使得模型能够更好地捕捉到特定领域内的细微差别。 ```python for epoch in range(num_epochs): for inputs, labels in dataloaders['train']: outputs = model(inputs) loss = criterion(outputs, labels) optimizer.zero_grad() loss.backward() optimizer.step() scheduler.step() # 定期保存checkpoint并在验证集上评估性能... ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值