2 3 5 7作为因子构成的数字序列——笔试题

类似leetcode的丑数II 

链接:https://leetcode-cn.com/problems/ugly-number-ii/

2 3 5 7作为因子构成的数字序列——笔试题

 

说回这个题

而这个是只有2 3 5 7四种因子,不包含本身,即序列为4 6 8 9 10 ...

输入正整数n

输出序列中第n个数 (可能很大,对1e9+7取模)

 

用dp三指针实现,cpp代码如下

 1 #include <bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 int mo = 1e9+7;
 6 
 7 int getNum(int n){
 8     vector<int> dp(n+10);
 9     dp.at(0) = 1;
10     int p2,p3,p5,p7;
11     p2 = p3 = p5 = p7 = 0;
12     for(int i=1;i<n+10;++i){
13         dp.at(i) = min(min(min(2 * dp.at(p2), 3 * dp.at(p3)), 5 * dp.at(p5)),7 * dp.at(p7)) % mo;    //计算数组, 直接取模
14         if(dp.at(i) == 2 * dp.at(p2))
15             ++p2;
16         if(dp.at(i) == 3 * dp.at(p3))
17             ++p3;
18         if(dp.at(i) == 5 * dp.at(p5))
19             ++p5;
20         if(dp.at(i) == 7 * dp.at(p7))
21             ++p7;
22     }
23     for(vector<int>::iterator iter = dp.begin();iter!=dp.end(); ){      //删除2 3 5 7四个原因子
24     if( *iter == 2 || *iter == 3 || *iter == 5 || *iter == 7){
25           iter = dp.erase(iter);
26     }else
27             iter ++ ;
28     }
29     return dp.at(n);
30 }
31 
32 int main()
33 {
34     int n;
35     cin>>n;
36     cout<<getNum(n);
37     return 0;
38 }

 

测试输出一下序列,正确。

2 3 5 7作为因子构成的数字序列——笔试题

 

可惜昨晚笔试的时候没想出来 

上一篇:53. 最大子序和【DP常见的模型】


下一篇:2016-2017 ACM-ICPC, Asia Tsukuba Regional Contest