由于需要对1e9
取模,所以理论上应该只能走9步,我们应该从最大的数开始搜索,递归9层return。
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
const int N = 200010;
vector<PII> g[N];
int a[N],b[N];
int n;
int res=0;
void dfs(int u,int sum,int d)
{
res=max(res,sum);
if(d>=9) return ;
for(auto &j:g[u])
dfs(j.first,sum*10+j.second,d+1);
}
int main()
{
int n;scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=n;i++) scanf("%d",&b[i]);
for(int i=1;i<=n;i++) g[i].push_back({a[i],b[i]});
int mx=0;
for(int i=1;i<=n;i++) if(b[i]>mx) mx=b[i];
for(int i=1;i<=n;i++)
if(b[i]==mx)
dfs(i,0,0);
cout<<res;
return 0;
}
我们对于a
数组里面所有数字进行分解,时间复杂度(
n
n
n\sqrt{n}
nn
),再对b
数组中的所有数字进行分解,判断每个因数是否是否可以与a
的因数组成答案
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=100010;
int a[N],b[N],d[N];
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n;cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) cin>>b[i];
for(int i=1;i<=n;i++)
{
int x=b[i];
for(int j=1;j<=x/j;j++)
if(x%j==0)
{
d[j]=max(d[j],x);
d[x/j]=max(d[x/j],x);
}
}
LL ans=-1;
for(int i=1;i<=n;i++)
for(int j=1;j<=a[i]/j;j++)
if(a[i]%j==0 && d[j])
{
ans=max(ans,(LL)a[i]*d[j]*j);
ans=max(ans,(LL)a[i]*d[a[i]/j]*a[i]/j);
}
cout<<ans;
return 0;
}
我们需要小心这样的数据
4
what's modui
what's moduij
moduij
modui
2
当出现多个答案之后我们应该优先处理最长的字符串。
#include <bits/stdc++.h>
using namespace std;
int main()
{
map<string,bool> st;
set<pair<string,int>> b;
int res=0;
int n;cin>>n;
for(int i=1; i<=n; i++)
{
string s;cin>>s;
if(s=="what's")
{
cin>>s;
b.insert({s,s.size()});
}
else
{
string pos="-1";
for(auto &p:b)
{
string k=p.first;
int j=p.second;
string str=s.substr(0,j);
if(!st[k] && str==k)
pos=k;
}
if(pos!="-1")
{
res++;
st[pos]=true;
}
}
}
cout<<res;
return 0;
}
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int main()
{
string a,b,c,d;cin>>a>>b>>c>>d;
bool ok1=0,ok2=0;
if(a.size()>=6 || b.size()>=6) ok1=1;
if(c.size()>=6 || d.size()>=6) ok2=1;
LL aa,bb,cc,dd,sum1,sum2;
if(!ok1)
{
aa=stoll(a);
bb=stoll(b);
sum1=aa*aa+bb*bb;
if(sum1>1000000) ok1=1;
}
if(!ok2)
{
cc=stoll(c);
dd=stoll(d);
sum2=cc*cc+dd*dd;
if(sum2>1000000) ok2=1;
}
if(ok1 && ok2) cout<<"Draw";
else if(ok1) cout<<"Bob";
else if(ok2) cout<<"Alice";
else if(sum1>sum2) cout<<"Bob";
else if(sum1<sum2) cout<<"Alice";
else if(sum1==sum2) cout<<"Draw";
return 0;
}