题目
内容
有一个神秘数字 k k k, 1 ≤ k ≤ n 1\le k\le n 1≤k≤n, n ≤ 500 n\le500 n≤500 .你需要给出一个数 c c c,然后你会得到 g c d ( c , k ) gcd(c,k) gcd(c,k),你要判断 k k k是否为给定的数字.输出最小的c.
例如 n=10,k=7,那么c=7即可判断k是否为7
分析
我们需要是 g c d ( c , k ) gcd(c,k) gcd(c,k)是独一无二的,也就是让 g c d ( c , i ) 都 不 等 于 g c d ( c , k ) gcd(c,i)都不等于gcd(c,k) gcd(c,i)都不等于gcd(c,k)
答案: 令 x ∗ k ≤ n x*k\le n x∗k≤n ,则ans= 小于等于 x m a x x_{max} xmax的质数乘积,再乘k.
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef vector<int> vi;
#define debug(x) cerr<<#x<<' '<<x<<'\n'
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
const int maxn=1e3+10;
const int mod=1e9+7;
const int inf=0x3f3f3f3f;
bool vis[1000];
int prime[1000];
void init() {
rep(i,2,600) {
if(prime[i]==0) prime[++prime[0]]=i;
else continue;
for(int j=2;j*i<1000;j++) prime[j*i]=1;
}
}
int a[10000],len=1;
void mul_(int x) {
rep(i,0,len-1) a[i]*=x;
rep(i,0,len-1) {
a[i+1]+=a[i]/10;
a[i]%=10;
}
while(a[len]!=0) {
a[len+1]+=a[len]/10;
a[len]%=10;
len++;
}
}
int n,k;
int main()
{
ios::sync_with_stdio(false);cin.tie(0);
int t;
cin>>t;
init();
while(t--) {
memset(a,0,sizeof(a));
len=1;
cin>>n>>k;
a[0]=k;
int up=1;
while(up*k+k<=n) up++;
rep(i,1,prime[0]) {
if(prime[i]<=up) mul_(prime[i]);
else break;
}
per(i,len-1,0) cout<<a[i];
cout<<'\n';
}
return 0;
}