列表

详情


NC21738. 牛牛与数组

描述

牛牛喜欢这样的数组:
1:长度为n
2:每一个数都在1到k之间
3:对于任意连续的两个数A,B,A<=B 与(A % B != 0) 两个条件至少成立一个

请问一共有多少满足条件的数组,对1e9+7取模

输入描述

输入两个整数n,k

1 ≤ n ≤ 10
1 ≤ k ≤ 100000

输出描述

输出一个整数

示例1

输入:

2 2

输出:

3

示例2

输入:

9 1

输出:

1

示例3

输入:

3 3

输出:

15

示例4

输入:

2 1234

输出:

1515011

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

pypy3 解法, 执行用时: 179ms, 内存消耗: 29520K, 提交时间: 2023-07-19 16:48:07

n,k=map(int,input().split())
mod=10**9+7
f=[0]+[1]*k

for _ in range(n-1):
    total=sum(f)%mod
    nf=[0]*(k+1)
    for i in range(1,k+1):
        if i==1:
            nf[i]=1
        else:
            nf[i]=total
            c=2
            while c*i<=k:
                nf[i]=(nf[i]-f[c*i]+mod)%mod
                c+=1
    f=nf
    #print(f)
print(sum(f)%mod)

            
            
            
    

C++14(g++5.4) 解法, 执行用时: 54ms, 内存消耗: 4156K, 提交时间: 2020-08-11 14:12:42

#include<cstdio>
using namespace std;
const int N=20,M=100005,P=1000000007;
int n,m;
int f[N][M];
int s[N];
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++) f[1][i]=1;
	s[1]=m;
	for(int i=2;i<=n;i++){
		s[i]=0; 
		for(int j=1;j<=m;j++){
			f[i][j]=s[i-1];
			for(int k=j+j;k<=m;k+=j){
				f[i][j]=(f[i][j]-f[i-1][k])%P;
			}
			s[i]=(s[i]+f[i][j])%P;
		}
	}
	printf("%d",s[n]);
	return 0;
} 

C++11(clang++ 3.9) 解法, 执行用时: 38ms, 内存消耗: 4252K, 提交时间: 2020-08-24 16:13:38

#include<bits/stdc++.h>
using namespace std;
#define MOD 1000000007
int dp[11][100010];
int main()
{
	int n,k;
	int i,j,p,t,sum=0,m;
	cin>>n>>k;
	for(i=1;i<=k;i++)
	{
		dp[1][i]=1;
		sum+=dp[1][i];
	}
	for(i=2;i<=n;i++)
	{
		p=sum;
		sum=0;
		for(j=1;j<=k;j++)
		{
			t=p;
			for(m=2*j;m<=k;m=m+j)
			t=(t-dp[i-1][m])%MOD;
			dp[i][j]=t;
			sum=(sum+t)%MOD;
		}
	}
	cout<<sum;
	return 0;
}

Python(2.7.3) 解法, 执行用时: 1824ms, 内存消耗: 9688K, 提交时间: 2019-07-12 16:15:11

import sys
line = sys.stdin.readline().strip()
esp = 1000000007
n,k = [int(i) for i in line.split(" ")]
count = [1] * (k+1)
count[0] = 0
res = k
for i in range(n - 1):
    for j in range(2, k+1):
        count[j] = res
        for l in range(j * 2, k+1, j):
            count[j] -= count[l]
    res = sum(count) % esp
print res

上一题