题目:2338. 统计理想数组的数目
思路:参考大佬的解题思路
C++版本:
class Solution {
public:
const int mod =1e9+7;
void solve(int maxValue,vector<vector<int>> &v,vector<vector<long long>> &c,int n){
//每个数可以被分解的质数的个数
for(int i=1;i<=maxValue;i++){
int x=i;
for(int j=2;j<=x/j;j++){
if(x%j==0){
int cnt=0;
while(x%j==0){
cnt++;
x/=j;
}
v[i].push_back(cnt);
}
}
if(x>1){
v[i].push_back(1);
}
}
//组合数
for(int i=0;i<=n+14;i++){
c[i][0]=1;
for(int j=1;j<=min(i,14);j++){
c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod;
}
}
}
int idealArrays(int n, int maxValue) {
vector<vector<int>> v(maxValue+1,vector<int>());
vector<vector<long long>> c(n+20,vector<long long>(20,0));
solve(maxValue,v,c,n);
long long ans=0;
for(int i=1;i<=maxValue;i++){
long long sum=1;
for(auto x:v[i]){
sum=(sum*c[n+x-1][x])%mod;
}
ans=(ans+sum)%mod;
}
return ans%mod;
}
};
JAVA版本:
class Solution {
static final int mod =1000000000+7;
List<Integer>[] v;
long[][] c;
void solve(int maxValue,int n){
for(int i=1;i<=maxValue;i++){
int x=i;
v[i] = new ArrayList<>();
for(int j=2;j<=x/j;j++){
if(x%j==0){
int cnt=0;
while(x%j==0){
cnt++;
x/=j;
}
v[i].add(cnt);
}
}
if(x>1){
v[i].add(1);
}
}
for(int i=0;i<=n+14;i++){
c[i][0]=1;
for(int j=1;j<=Math.min(i,14);j++){
c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod;
}
}
}
public int idealArrays(int n, int maxValue) {
v= new ArrayList[maxValue+5];
c= new long[n+20][20];
solve(maxValue,n);
long ans=0;
for(int i=1;i<=maxValue;i++){
long sum=1;
for(var x:v[i]){
sum=(sum*c[n+x-1][x])%mod;
}
ans=(ans+sum)%mod;
}
return (int)(ans%mod);
}
}
Go版本:
const mod = 1000000000+7
var v [][]int
var c [][]int64
func solve(n,maxValue int) {
v= make([][]int ,maxValue+5);
c= make([][]int64,n+20);
for i:=1;i<=maxValue;i++ {
x :=i
v[i]=make([]int,0)
for j:=2;j<=x/j;j++ {
if x%j!=0 {
continue
}
cnt :=0
for x%j==0 {
cnt++
x/=j
}
v[i]=append(v[i],cnt)
}
if x>1 {
v[i]=append(v[i],1)
}
}
for i:=0;i<n+15;i++ {
c[i]=make([]int64,20)
c[i][0]=1
for j:=1 ;j<=min(i,15);j++ {
c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod
}
}
}
func idealArrays(n int, maxValue int) int {
solve(n,maxValue);
var ans int64 =0
for i:=1;i<=maxValue;i++ {
var sum int64 = 1
for _,x := range v[i] {
sum=(sum*c[n+x-1][x])%mod
}
ans=(ans+sum)%mod
}
return int(ans)
}