题目链接:
https://www.lanqiao.cn/problems/1463/learning/?subject_code=1&group_code=4&match_num=12&match_flow=1&origin=cup
思想:两个循环 1e5*1e5 虽然会超时 但是是填空题
正解是dfs ,先找出 n 的因子。
暴力代码:
#include<bits/stdc++.h>
using namespace std;
//#define int long long
typedef long long ll;
typedef pair<int,int> pii;
const int N = 5e2+5;
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
//ll n=202041820210418;
ll n=2021041820210418;
ll ans=0;
for(ll i=1;i*i*i<=n;i++){
if(n%i==0){
ll s=n/i;
for(ll j=i;i*j*j<=n;j++){
if(s%j==0){
ll k=n/i/j;
if(i==j&&j==k){
ans+=1;
}
else if((i==j&&j!=k)||(i==k&&j!=i)||(j==k&&i!=j)){
ans+=3;
}
else if(i!=j&&j!=k&&i!=k){
ans+=6;
}
}
}
}
}
cout<<ans<<"\n";
return 0;
}
dfs代码:
#include<bits/stdc++.h>
using namespace std;
//#define int long long
typedef long long ll;
typedef pair<int,int> pii;
const int N = 5e2+5;
ll n,ans;
ll arr[5];
ll d[N],x=0;
void dfs(int step){
if(step>=3){
if(arr[0]*arr[1]*arr[2]==n){
ans++;
}
return;
}
for(int i=0;i<x;i++){
arr[step]=d[i];
dfs(step+1);
}
return;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
//ll n=202041820210418;
n=2021041820210418;
for(ll i=1;i*i<=n;i++){
if(n%i==0){
if(n/i!=i){
d[x++]=i;
d[x++]=n/i;
}
else d[x++]=i;
}
}
dfs(0);
cout<<ans<<"\n";
return 0;
}