最大公约数-脑洞

题目

题目链接

内容

有一个神秘数字 k k , 1 k n 1\le k\le n , n 500 n\le500 .你需要给出一个数 c c ,然后你会得到 g c d ( c , k ) gcd(c,k) ,你要判断 k k 是否为给定的数字.输出最小的c.

例如 n=10,k=7,那么c=7即可判断k是否为7

分析

我们需要是 g c d ( c , k ) gcd(c,k) 是独一无二的,也就是让 g c d ( c , i ) g c d ( c , k ) gcd(c,i)都不等于gcd(c,k)

答案: 令 x k n x*k\le n ,则ans= 小于等于 x m a x x_{max} 的质数乘积,再乘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;
}


发布了10 篇原创文章 · 获赞 0 · 访问量 329

猜你喜欢

转载自blog.csdn.net/WA_King/article/details/104071084