Codeforces 632D Longest Subsequence 【求因子和变形】
2016-03-04 22:10
465 查看
D. Longest Subsequence
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output
You are given array a with n elements
and the number m. Consider some subsequence of a and
the value of least common multiple (LCM) of its elements. Denote LCM as l. Find any longest subsequence of a with
the value l ≤ m.
A subsequence of a is an array we can get by erasing some elements of a.
It is allowed to erase zero or all elements.
The LCM of an empty array equals 1.
Input
The first line contains two integers n and m (1 ≤ n, m ≤ 106)
— the size of the array a and the parameter from the problem statement.
The second line contains n integers ai (1 ≤ ai ≤ 109)
— the elements of a.
Output
In the first line print two integers l and kmax (1 ≤ l ≤ m, 0 ≤ kmax ≤ n)
— the value of LCM and the number of elements in optimal subsequence.
In the second line print kmax integers
— the positions of the elements from the optimal subsequence in the ascending order.
Note that you can find and print any subsequence with the maximum length.
Examples
input
output
input
output
fuck,偷懒用cin>>,T了。。。
题意:给定一个n元素构成的序列和一个数m,让你找到一个最长的子序列c[]使得lcm(c[]) <= m。输出序列的lcm 和 长度以及 组成这个序列的元素下标。
思路:发现m最大为10^6,可以直接暴力搞出i(1 <= i <= m)在序列中的因子数sum[i],就是求因子和的变形。
然后我们找到最大的sum[i],这个就是满足题意的子序列的最大长度。此时对应的i并不一定是子序列的lcm,我们就从末尾扫一次,对符合条件的元素求一次lcm即可。
AC代码:
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output
You are given array a with n elements
and the number m. Consider some subsequence of a and
the value of least common multiple (LCM) of its elements. Denote LCM as l. Find any longest subsequence of a with
the value l ≤ m.
A subsequence of a is an array we can get by erasing some elements of a.
It is allowed to erase zero or all elements.
The LCM of an empty array equals 1.
Input
The first line contains two integers n and m (1 ≤ n, m ≤ 106)
— the size of the array a and the parameter from the problem statement.
The second line contains n integers ai (1 ≤ ai ≤ 109)
— the elements of a.
Output
In the first line print two integers l and kmax (1 ≤ l ≤ m, 0 ≤ kmax ≤ n)
— the value of LCM and the number of elements in optimal subsequence.
In the second line print kmax integers
— the positions of the elements from the optimal subsequence in the ascending order.
Note that you can find and print any subsequence with the maximum length.
Examples
input
7 8 6 2 9 2 7 2 3
output
6 5 1 2 4 6 7
input
6 4 2 2 2 3 3 3
output
2 3 1 2 3
fuck,偷懒用cin>>,T了。。。
题意:给定一个n元素构成的序列和一个数m,让你找到一个最长的子序列c[]使得lcm(c[]) <= m。输出序列的lcm 和 长度以及 组成这个序列的元素下标。
思路:发现m最大为10^6,可以直接暴力搞出i(1 <= i <= m)在序列中的因子数sum[i],就是求因子和的变形。
然后我们找到最大的sum[i],这个就是满足题意的子序列的最大长度。此时对应的i并不一定是子序列的lcm,我们就从末尾扫一次,对符合条件的元素求一次lcm即可。
AC代码:
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <map> #include <string> #include <vector> #include <queue> #include <stack> #define CLR(a, b) memset(a, (b), sizeof(a)) #define ll o<<1 #define rr o<<1|1 using namespace std; typedef long long LL; const int MOD = 1e9+7; const int MAXN = 1e6+10; const int INF = 0x3f3f3f3f; void add(LL &x, LL y) {x += y; x %= MOD;} map<LL, int> fp; LL gcd(LL a, LL b) { return b == 0 ? a : gcd(b, a%b); } LL lcm(LL a, LL b) { return a / gcd(a, b) * b; } LL a[MAXN]; int sum[MAXN]; int main() { int n, m; cin >> n >> m; fp.clear(); for(int i = 1; i <= n; i++) scanf("%lld", &a[i]), fp[a[i]]++; for(int i = 1; i <= m; i++) { if(i == 1) sum[i] = fp[1]; else sum[i] = fp[i] + fp[1]; } for(int i = 2; i*i <= m; i++) { for(int j = i; i*j <= m; j++) { if(i == j) sum[i*j] += fp[i]; else sum[i*j] += fp[i] + fp[j]; } } int ans = 0; LL Wlcm = 1LL; for(int i = m; i >= 1; i--) { if(sum[i] > ans) { Wlcm = i; ans = sum[i]; } //num[i] = 0; } LL Tlcm = 1LL; stack<int> S; for(int i = n; i >= 1; i--) { if(Wlcm % a[i] == 0) { Tlcm = lcm(Tlcm, a[i]); S.push(i); } } cout << Tlcm << " " << ans << endl; int num = 0; while(!S.empty()) { if(num) cout << " "; cout << S.top(); S.pop(); num++; } cout << endl; return 0; }
相关文章推荐
- 关于easy- ui - tree的前篇 (1):
- 1.3:Union-Find算法-----quick-find算法
- OSWatcher Analyzer User Guide (文档 ID 461053.1)
- 矩阵乘法(SequenceFile作为输入源)--使用IDEA调试
- Requests库的几种请求 - 通过API操作Github
- 不能将多个项传入“Microsoft.Build.Framework.ITaskItem”类型的参数
- 深入掌握include_once与require_once的区别
- POJ3581 Sequence(后缀数组)
- 中间透明的UIView实现的几种方法
- iOS UIBezierPath 路径裁剪
- ue4点滴
- Java StringBuilder & StringBuffer 源代码分析
- USACO 之 Section 1.4 More Search Techniques (已解决)
- 华为EMUI4.0 基于android 6.0的bug
- BlockingQueue
- Android源码浅析: Message/Handler/MessageQueue/Looper
- PAT (Advanced Level) Practise 1017 Queueing at Bank (25)
- [hdu4010]: Query on The Trees
- SPOJ QTREE Query on a tree [树链剖分+线段树]
- NSOperationQueue与GCD的使用原则和场景