首页 > 试题广场 >

小易喜欢的数列

[编程题]小易喜欢的数列
  • 热度指数:288 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
小易非常喜欢拥有以下性质的数列:
1、数列的长度为n
2、数列中的每个数都在1到k之间(包括1和k)
3、对于位置相邻的两个数A和B(A在B前),都满足(A <= B)或(A mod B != 0)(满足其一即可)
例如,当n = 4, k = 7
那么{1,7,7,2},它的长度是4,所有数字也在1到7范围内,并且满足第三条性质,所以小易是喜欢这个数列的
但是小易不喜欢{4,4,4,2}这个数列。小易给出n和k,希望你能帮他求出有多少个是他会喜欢的数列。

输入描述:
输入包括两个整数n和k(1 ≤ n ≤ 10, 1 ≤ k ≤ 10^5)


输出描述:
输出一个整数,即满足要求的数列个数,因为答案可能很大,输出对1,000,000,007取模的结果。
示例1

输入

2 2

输出

3
#include <cmath>
#include <climits>
#include <sstream>
#include <iostream>
#include <map>
#include <vector>
#include <string>
#include <stack>
#include <queue>
#include <numeric>
#include <unordered_map>
#include <unordered_set>
#include <algorithm>
using namespace std;
#define f(i, n, m) for(int i=n; i<m; i++)
class Solution{
    public:
    int ret = 0;
    long long int kmod = 1000000007;
    int solve(int k, int n){
        vector<vector<long long int>> dp;
        dp.resize(n+1);
        f(i, 1, n+1){
            if(i==1) {dp[1].resize(k+1, 1);dp[1][0]=0;}
            else dp[i].resize(k+1, 0);
        }

        for(int i = 2; i < n+1; ++i) {
            long long int sum = accumulate(
                dp[i-1].begin(),  dp[i-1].end(), 0, 
                [&](long long int a, long long int b){ return (a+b) % kmod; }
            );
            for( int j = 1; j < k+1; ++j){
                long long int ret = 0;
                for(int idx = j+j; idx <= k; idx+=j){
                    ret += dp[i-1][idx];
                    ret %= kmod;
                }
                dp[i][j] = (sum - ret + kmod)%kmod;
            }
        }
        // for (auto &t:dp){
        //     showVector(t);
        //}
        return accumulate(
                dp[n].begin(),  dp[n].end(), 0, 
                [&](long long int a, long long int b){ return (a+b) % kmod; }
            );
    }
};
int main(){
    Solution a;
    int n, k;
    cin >> n;
    cin >> k;
    cout << a.solve(k, n)<<endl;
}

发表于 2020-06-11 00:00:35 回复(0)
cal = 0
n, k = list(map(int, input().split(' ')))
min_value = (1 - 10 ** int(n))/(1 - 10)
max_value = k * (1 - 10 ** int(n))/(1 - 10)
print(min_value)
print(max_value)
min_value = int(min_value)
max_value = int(max_value)

for i in range(min_value, max_value + 1, 1):
    BOOL = True
    S = str(i)
    re.sub("", " ", S)
    if "0" in S:
        BOOL = False
    else:
        for j in range(n-1):
            if int(S[j]) <= int(S[j + 1]) or int(S[j]) % int(S[j + 1]) != 0:
                pass
            else:
                BOOL = False
    if BOOL == True:
        print(S)
        cal = cal + 1
        
print(cal)
发表于 2020-06-09 17:18:04 回复(0)