0729
已结束
IOI
开始于: 2026-7-29 13:30
3
小时
主持人:
3
#include <bits/stdc++.h>
#define ll long long
#define maxn 100005
#define mod 998244353
using namespace std;
int p[maxn+5],prime[maxn],tot;
ll n;
ll best=0,num=0,ok;
int zd=0;
map<pair<ll,ll>,int> vis;
void dfs(ll i,ll x,ll y,ll now)
{
ll tx=x,ty=y,tt=0,ii=i;
while (tx*prime[ii]<=n) {tx*=prime[ii++]; tt++;}
ii=i;
while (ty*prime[ii]<=n) {ty*=prime[ii++]; tt++;}
// cout<<i<<" "<<x<<" "<<y<<endl;
zd=max(zd+0ll,i);
if (x<0 || y<0) exit(1);
if (tt+now<best) return;
if (now>=best)
{
if (now>best) best=now,num=1,ok=i;
else num++,ok=max(i,ok);
}
ll t1=x,t2=y;
while (true)
{
t1*=prime[i]; t2*=prime[i];
if (t1>n && t2>n) break;
if (t1>n) t1=n+1; if (t2>n) t2=n+1;
if (t1<=n) dfs(i+1,t1,y,now+1);
if (x!=1 && t2<=n) dfs(i+1,x,t2,now+1);
}
if (prime[i+1]*min(x,y)<=n) dfs(i+1,x,y,now);
return;
}
void init()
{
for (int i=2;i<=maxn;i++)
if (!p[i])
{
prime[++tot]=i;
for (int j=i+i;j<=maxn;j+=i) p[j]=1;
}
}
int main()
{
//freopen("select.in","r",stdin);
//freopen("select.out","w",stdout);
init();
cin>>n;
dfs(1,1,1,0);
cout<<best<<" "<<num<<endl;
// cout<<prime[ok]<<endl;
}
- 状态
- 已结束
- 规则
- IOI
- 题目
- 5
- 开始于
- 2026-7-29 13:30
- 结束于
- 2026-7-29 16:30
- 持续时间
- 3 小时
- 主持人
- 参赛人数
- 3