Codeforces Round #696 (Div. 2) 补题A B

A. Puzzle From the Future

在这里插入图片描述

分析:贪心算法,思路是如果这一位 + 1 +1 +1与上一位相等,就不加,否则就 + 1 +1 +1 i = 0 i=0 i=0时必定 + 1 +1 +1
代码:

#include <bits/stdc++.h>
using namespace std;
int main(){
    
    
    int t;
    cin>>t;
    while(t--){
    
    
        int n,i;
        string a,b="1";
        cin>>n>>a;
        for (i=1;i<n;i++){
    
    
            if('1'+a[i]!=b[i-1]+a[i-1]) b+="1";
            else b+="0";
        }
        cout<<b<<endl;
    }
}

B. Different Divisors

在这里插入图片描述
分析: 暴力做法会超时,所以考虑找规律。发现答案的4个除数是这么构成的: 1 1 1,质数,质数,本身。所以可以用素数筛,然后找出第一个 ≥ d + 1 \ge d+1 d+1的质数,再找出第二个与第一个质数相差 ≥ d \ge d d的质数。最后两个质数相乘就是答案。

证明: 如果 [ 1 , d + 1 ] [1,d+1] [1,d+1]之间有因子,那么因子之间的差值必定 < d <d <d,不满足。如果存在一个数满足( p i pi pi为质数) 1 , p 1 , p 2 , . . . , p n , L C M ( p 1 , p 2 , . . . , p n ) 1,p_1,p_2,...,p_n,LCM(p_1,p_2,...,p_n) 1,p1,p2,...,pn,LCM(p1,p2,...,pn)那么必定有 1 , p 1 , p 2 , p 1 ∗ p 2 1,p_1,p_2,p_1*p_2 1,p1,p2,p1p2(假设差值全部 ≥ d \ge d d)。而且如果有 p 1 − 1 ≥ d , p_1 -1\ge d, p11d,必然有 p 2 − p 1 ≥ d , p 1 ∗ p 2 − p 2 = p 1 ∗ ( p 1 − 1 ) ≥ p 2 ∗ d ≥ d p2-p1\ge d,p1*p2-p2=p1*(p1-1)\ge p2*d \ge d p2p1d,p1p2p2=p1(p11)p2dd
代码:

注意 m a x n maxn maxn的值不能是 10000 10000 10000,应该要开 3 ∗ d = 30000 3*d=30000 3d=30000

#include<stdio.h>
#define maxn 30005
bool prime[maxn];
int p[maxn],total;
void init(){
    
    
    int i,j;
    prime[0]=prime[1]=false; 
    for(i=2;i<=maxn;i++){
    
    
        prime[i]=true;
    }
    for(i=2;i<=maxn;i++){
    
    
        if(prime[i]==true){
    
    
        	p[++total]=i;
		}
        for(j=1;j<=total&&p[j]*i<=maxn;j++){
    
    
            prime[i*p[j]]=false;
            if(i%p[j]==0){
    
    
            	break;
			}
        }
    }
} 
int main(){
    
    
    init();
    int t,d,i,j;
    scanf("%d",&t);
    while(t--){
    
    
        int flag=0;
        scanf("%d",&d);
        for(i=1;i<=total;i++){
    
    
            if(p[i]>=d+1){
    
    
                flag=p[i];
                break;
            }
        }
        for(j=i+1;j<=total;j++){
    
    
            if(p[j]-flag>=d) break;
        }
        printf("%d\n",flag*p[j]);
    }
}

猜你喜欢

转载自blog.csdn.net/messywind/article/details/112858399