河南萌新联赛2025第(四)场:河南大学

河南萌新联赛2025第(四)场算法题解析

河南萌新联赛2025第(四)场:河南大学

Trailing Zeroes (III)

来源:Trailing Zeroes (III) | LightOJ

本题较为模板(但对我来说也不代表就简单),主要是给B题做铺垫。

思路

要找0的个数,我们都知道一个10一定是同时有2和5才行,但是我们会发现只要有5的地方必定有很多的2,所以就把问题转化成了:找到最小的N使N!的个数为m个。

  • 5的个数满足要求
  • 二分答案找到最小的N

代码

// Problem: Trailing Zeroes (III)
// Contest: LightOJ
// URL: https://lightoj.com/problem/trailing-zeroes-iii
// Memory Limit: 64 MB
// Time Limit: 1000 ms
// Submission Time: 2025-08-07 10:43:43

int count(int x)
{
   
   
    int cnt=0;
    while(x>0)// x/5+x/25+···每多一个5的次方就会多贡献一次
    {
   
   
        x/=5;
        cnt+=x;
    }
    return cnt;
}
int check(int m)//二分找到最小的符合的那个数
{
   
   
    int l=1,r=5*m;
    int ans=-1;
    while(l<=r)
    {
   
   
        int mid=(l+r)/2;
        int cnt=count(mid);
        if(cnt==m)
        {
   
   
            ans=mid;
            r=mid-1;
        }
        else if(cnt<m)
            l=mid+1;
        else r=mid-1;
    }
    return ans;
}

void solve()
{
   
   
    cin>>n;
    for(int i=1;i<=n;i++)//2总比5多,找5的个数就是0的个数
    {
   
   
        cin >> m;
        cout << "Case " << i << ": ";
        int x=check(m);
        if(x==-1)
            cout << "impossible" << endl;
        else
            cout << x << endl;
    }
}

B、0!!!!!

来源:B-0!!!!!_河南萌新联赛2025第(四)场:河南大学

思路

  • 要找0的个数还是和刚才那样找2和5的个数,不同的是这次是因数中,2不一定多于5了
  • 一直计算2的幂,只要在y之内都会算上
  • 之后就用分块算 2i 总共有多少就行了

代码

int f(int x, int y)//要找的数、右边界
{
   
   
	int ans=0;
	for(int i=x; i<=y; i*=x)//x^k次方
	{
   
   
		int n=y/i;
		for(int l=1; l<=n; l++)//分块计算
		{
   
   
			int r=n/(n/l);
			ans+=(n/l)*(r-l+1);
			l=r;
		}
	}
	return ans;
}
void solve()
{
   
   
	cin >> l >> r;
	int f2=f(2,r)-f(2,l-1);
	int f5=f(5,r)-f(5,l-1);
	cout << min(f2,f5);
}

D、箭头谜题Ⅰ

来源:D-箭头谜题Ⅰ_河南萌新联赛2025第(四)场:河南大学

思路

其实大思路并不难,就是一个普通的BFS,最后检查终点状态就行了。开始我还以为是用DFS,但是如果不是最短路的话可能会浪费魔法次数

  • 用二维vector去存图,不然内存会超
  • 利用双端队列根据魔法的使用改变此路径的优先级
  • 最后只用检查终点状态是否符合条件就行了

代码

// Problem: 箭头谜题Ⅰ
// Contest: NowCoder
// URL: https://ac.nowcoder.com/acm/contest/115184/D
// Memory Limit: 512 MB
// Time Limit: 2000 ms
// Submission Time: 2025-08-07 13:23:42

string idx="UDLR";//上下左右
struct pi
{
   
   
	int x,y,st;
}p[N];
vector<pii> d={
   
   {
   
   -1,0},{
   
   1,0},{
   
   0,-1},{
   
   0,1}};
void solve()
{
   
   
	cin >> n >> m >> k;//此题为多实例,最好都开里面
	vector<string> v(n);
	vector<vector<int>> vis(n,vector<int>(m,-1));//由于n,m最大都是1e6只能开vector
	for(int i=0; i<n; i++) cin >> v[i];
	deque<pi> q;
	q.push_back({
   
   0,0,0});//x,y,step
	while(!q.empty())
	{
   
   
		int x=q.front().x
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值