zoukankan      html  css  js  c++  java
  • CF912E Prime Gift 数学

    Opposite to Grisha's nice behavior, Oleg, though he has an entire year at his disposal, didn't manage to learn how to solve number theory problems in the past year. That's why instead of Ded Moroz he was visited by his teammate Andrew, who solemnly presented him with a set of n distinct prime numbers alongside with a simple task: Oleg is to find the k-th smallest integer, such that all its prime divisors are in this set.

    Input

    The first line contains a single integer n (1 ≤ n ≤ 16).

    The next line lists n distinct prime numbers p1, p2, ..., pn (2 ≤ pi ≤ 100) in ascending order.

    The last line gives a single integer k (1 ≤ k). It is guaranteed that the k-th smallest integer such that all its prime divisors are in this set does not exceed 1018.

    Output

    Print a single line featuring the k-th smallest integer. It's guaranteed that the answer doesn't exceed 1018.

    Examples
    Input
    Copy
    3
    2 3 5
    7
    Output
    Copy
    8
    Input
    Copy
    5
    3 7 11 13 31
    17
    Output
    Copy
    93
    Note

    The list of numbers with all prime divisors inside {2, 3, 5} begins as follows:

    (1, 2, 3, 4, 5, 6, 8, ...)

    The seventh number in this list (1-indexed) is eight.

    首先在1e18的范围内,那么质数的个数最多只有16个,你可以将这16个列出来然后相乘,看看多大;

    那么我们分开算;

    不妨将奇数位置的dfs和偶数位置的分别dfs;

    分别算出包含这些因子的所有可能值,如果对数组开多大不确定,用 vector.push_back就好;

    那么我们要求第k大,考虑二分答案;

    那么对于我们之前求出的那两个集合,我们用 two-pointer 来扫一遍确定当前答案是第几个;

    然后调整上下界即可;

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstdlib>
    #include<cstring>
    #include<string>
    #include<cmath>
    #include<map>
    #include<set>
    #include<vector>
    #include<queue>
    #include<bitset>
    #include<ctime>
    #include<deque>
    #include<stack>
    #include<functional>
    #include<sstream>
    //#include<cctype>
    //#pragma GCC optimize(2)
    using namespace std;
    #define maxn 300005
    #define inf 0x3f3f3f3f
    //#define INF 1e18
    #define rdint(x) scanf("%d",&x)
    #define rdllt(x) scanf("%lld",&x)
    #define rdult(x) scanf("%lu",&x)
    #define rdlf(x) scanf("%lf",&x)
    #define rdstr(x) scanf("%s",x)
    typedef long long  ll;
    typedef unsigned long long ull;
    typedef unsigned int U;
    #define ms(x) memset((x),0,sizeof(x))
    const long long int mod = 1e9 + 7;
    #define Mod 1000000000
    #define sq(x) (x)*(x)
    #define eps 1e-3
    typedef pair<int, int> pii;
    #define pi acos(-1.0)
    const int N = 1005;
    #define REP(i,n) for(int i=0;i<(n);i++)
    typedef pair<int, int> pii;
    inline ll rd() {
    	ll x = 0;
    	char c = getchar();
    	bool f = false;
    	while (!isdigit(c)) {
    		if (c == '-') f = true;
    		c = getchar();
    	}
    	while (isdigit(c)) {
    		x = (x << 1) + (x << 3) + (c ^ 48);
    		c = getchar();
    	}
    	return f ? -x : x;
    }
    
    ll gcd(ll a, ll b) {
    	return b == 0 ? a : gcd(b, a%b);
    }
    ll sqr(ll x) { return x * x; }
    
    /*ll ans;
    ll exgcd(ll a, ll b, ll &x, ll &y) {
    	if (!b) {
    		x = 1; y = 0; return a;
    	}
    	ans = exgcd(b, a%b, x, y);
    	ll t = x; x = y; y = t - a / b * y;
    	return ans;
    }
    */
    
    int n;
    int p[30]; ll k;
    vector<ll>vc[2];
    int tmp[30]; int cnt;
    
    void dfs(int belong, ll val, int cur) {
    	vc[belong].push_back(val);
    	for (int i = cur; i <= cnt; i++) {
    		if (1e18 / tmp[i] >= val) {
    			dfs(belong, val*tmp[i], i);
    		}
    	}
    }
    
    ll sol(ll x) {
    	ll res = 0;
    	int j = 0;
    	for (int i = vc[0].size() - 1; i >= 0; i--) {
    		while (j < vc[1].size() && vc[1][j] <= x / vc[0][i])j++;// 双指针扫一遍
    		res += j;
    	}
    	return res;
    }
    
    
    
    int main()
    {
    	//ios::sync_with_stdio(0);
    	rdint(n);
    	for (int i = 1; i <= n; i++)rdint(p[i]);
    	rdllt(k);
    	for (int i = 1; i <= n; i++)if (i & 1)tmp[++cnt] = p[i];
    	dfs(0, 1, 1);
    	cnt = 0;
    	for (int i = 1; i <= n; i++)if (i % 2 == 0)tmp[++cnt] = p[i];
    	dfs(1, 1, 1);
    	sort(vc[0].begin(), vc[0].end());
    	sort(vc[1].begin(), vc[1].end());
    	ll l = 1, r = 1e18;
    	while (l <= r) {
    		ll mid = (l + r) / 2;
    		if (sol(mid) >= k)r = mid - 1;
    		else l = mid + 1;
    	}
    	cout << l << endl;
    	return 0;
    }
    
    EPFL - Fighting
  • 相关阅读:
    mysql设置指定ip远程访问连接实例
    Hibernate学习笔记之EHCache的配置
    关于Hibernate中的Configuration
    Hibernate的一级缓存
    Hibernate工作原理
    org.hibernate.HibernateException: Could not parse configuration: /hibernate.cfg.xml
    微信多客户端
    【hadoop之翊】——CentOS6.5 Linux上面编译Hadoop2.4源代码
    HDU 2102 A计划 (三维的迷宫BFS)
    SSO 中间件 kisso
  • 原文地址:https://www.cnblogs.com/zxyqzy/p/10125444.html
Copyright © 2011-2022 走看看