前言
练习。
提示:以下是本篇文章正文内容,下面案例可供参考
一、题目
题目描述
有n箱货物,长宽高的方向上分别堆L、W、H的货物,满足n=L×W×H。给定n=2021041820210418,总共有多少种堆放货物的方案?
这里,(1 1 2021041820210418)和(2021041820210418 1 1)是两种不同的方案。
二、思路
设
n
=
a
b
c
n=abc
n=abc,使用暴力枚举获得答案。
先看
n
=
6
n=6
n=6。
a
a
a有几种选择?
a
=
1
,
2
,
3
a=1,2,3
a=1,2,3即可以选择
n
n
n的因子。设
n
n
n有
c
n
t
1
cnt_1
cnt1个因子,则
a
a
a有
c
n
t
1
cnt_1
cnt1种选择。
a
a
a确定了之后, 有
b
∗
c
=
n
/
a
b*c=n/a
b∗c=n/a。
b
b
b有几种选择?可以选择
n
/
a
n/a
n/a的因子。设
n
/
a
n/a
n/a有
c
n
t
2
cnt_2
cnt2个因子,则
b
b
b有
c
n
t
2
cnt_2
cnt2种选择。
因此我们求出
n
n
n的因子以及
a
a
a确定后
n
/
a
n/a
n/a的因子,
a
,
b
,
c
a,b,c
a,b,c就确定了一个情况。然后去个重就是答案。
因为是填空题,直接枚举
1
1
1到
s
q
r
t
(
n
)
sqrt(n)
sqrt(n)求因子就好了。细节看代码(完全乱写 )。
代码
代码如下(示例):
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll n=2021041820210418;
ll primes[10007];
ll primes_b[10007];
int cnt_p;
int cnt_b;
map<string,int>vis;
void get_p(ll x){
int i;
for(i=1;i<=sqrt(x);i++){
if(x%i==0){
primes[++cnt_p]=i;
}
}
int bcnt=cnt_p;
for(int i=bcnt;i>=1;i--){
ll per=x/primes[i];
primes[++cnt_p]=per;
}
}
void get_pa(ll x){
int i;
for(i=1;i<=sqrt(x);i++){
if(x%i==0){
primes_b[++cnt_b]=i;
}
}
int bcnt=cnt_b;
for(int i=bcnt;i>=1;i--){
ll per=x/primes_b[i];
primes_b[++cnt_b]=per;
}
}
string itos(ll x){
stringstream ss;
string res;
ss<<x;
ss>>res;
return res;
}
int main(){
//求n的因子
cnt_p=0;
get_p(n);
ll i,j;
ll ans=0;
for(i=1;i<=cnt_p;i++){//枚举a
ll a=primes[i];
cout<<"this is "<<a<<endl;
cnt_b=0;
get_pa(n/a);
for(j=1;j<=cnt_b;j++){//枚举b
ll b=primes_b[j];
ll c=n/a/b;
//a_b_c
string per="";
per+=itos(a);
per+=itos(b);
per+=itos(c);
//cout<<per<<endl;
if(vis[per]==1){
//cout<<"old\n";
continue;
}
else{//新的
//cout<<"new!\n";
vis[per]=1;
ans++;
}
}
}
cout<<ans<<endl;
return 0;
}
总结
m a p < s t r i n g , i n t > v i s map<string,int>vis map<string,int>vis也可以使用 m a p < n o d e , i n t > v i s map<node,int>vis map<node,int>vis代替,但是map是会自动排序的,使用自定义类型的时候,要告诉计算机你的类型怎么比较大小,否则会报错。