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,p1∗p2(假设差值全部 ≥ d \ge d ≥d)。而且如果有 p 1 − 1 ≥ d , p_1 -1\ge d, p1−1≥d,必然有 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 p2−p1≥d,p1∗p2−p2=p1∗(p1−1)≥p2∗d≥d。
代码:
注意 m a x n maxn maxn的值不能是 10000 10000 10000,应该要开 3 ∗ d = 30000 3*d=30000 3∗d=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]);
}
}