首页 > 其他分享 >每日一题-数论

每日一题-数论

时间:2022-12-06 10:48:04浏览次数:37  
标签:cnt cout 数论 每日 ++ int while -- 一题

数论

Description

\[给定n, m \in [1, 1e9]\\ 找到使得res=n \cdot x末尾零的个数最多, 结果最大的x, 其中,\\ x \in [1, m] \]

Solution

容易联想到经典题目, 求阶乘末尾零的数量. 只需要找到\(n\)中\(2\)和\(5\)的因子个数, 再用x里能有的\(2\)和\(5\)凑, 稍加模拟即可. 计算\(log_51e9 \sim log_21e9\)次.

Code

#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#include <bits/stdc++.h>

using namespace std;

#define int long long

void solve() {
	int n, m;
	cin >> n >> m;
	int t = n, num2 = 0, num5 = 0;
	
	while (t % 2 == 0) {
		t /= 2;
		num2 ++;
	} 
	
	while (t % 5 == 0) {
		t /= 5;
		num5 ++;
	}
//	cout << num2 << ' ' << num5 << ' ';

	if (num2 == num5) {
		int cnt = 0;
		t = 1;
		while (t < m) {
			t *= 10;
			cnt ++;
		}
		if (t > m) {
			t /= 10;
			if (cnt > 0) {
				cnt --;
			}
		}
		int i;
		for (i = 1; t * i <= m; ++i) {
		}
		if (t * i > m) {
			i --;
		}
		t *= i;
		cout << n * t << '\n';
	}
	if (num2 < num5) {
		int need2 = num5 - num2;
		
		t = 1;
		
		while (need2 and t < m) {
			t *= 2;
			need2 --;
		}
		
		if (t > m) {
			t /= 2;
			need2 ++;
		}
		int cnt = 0;
		while (t < m) {
			t *= 10;
			cnt ++;
		}
		if (t > m) {
			t /= 10;
			if (cnt > 0) {
				cnt --;
			}
		}
		int i;
		for (i = 1; t * i <= m; ++i) {
		}
		if (t * i > m) {
			i --;
		}
		t *= i;
		cout << n * t << '\n';
	}
	if (num2 > num5) {
		int need5 = num2 - num5;
		
		t = 1;
		
		while (need5 and t < m) {
			t *= 5;
			need5 --;
		}
		
		if (t > m) {
			t /= 5;
			need5 ++;
		}
		int cnt = 0;
		while (t < m) {
			t *= 10;
			cnt ++;
		}
		if (t > m) {
			t /= 10;
			if (cnt > 0) {
				cnt --;
			}
		}
		int i;
		for (i = 1; t * i <= m; ++i) {
		}
		if (t * i > m) {
			i --;
		}
		t *= i;
		cout << n * t << '\n';
	}
}

signed main() {
	IOS;
	int T;
	cin >> T;
	
	while (T --) {
		solve();
	}
}

标签:cnt,cout,数论,每日,++,int,while,--,一题
From: https://www.cnblogs.com/whose-dream/p/16954523.html

相关文章

  • [go-每日一库] go-gin项目使用realize实现代码、文件改动热更新
    之前用django编写web应用时,每次保存,django应用都是重新加载-热更新,最近在写gin应用,了解到golang常用的热更新可以用到fresh/gin/gowatch/bee/realize/air等,本文主要分享rea......
  • 第322场周赛第一题
    句子是由单个空格分隔的一组单词,且不含前导或尾随空格。例如,"HelloWorld"、"HELLO"、"helloworldhelloworld"都是符合要求的句子。单词仅由大写和小写英文字母组......
  • 每日算法之二叉搜索树的后序遍历序列
    JZ33二叉搜索树的后序遍历序列描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数......
  • 《一些特殊的数论函数求和问题》阅读笔记
    好至少它教会了我如何把质数求和转化成积分的渐进对着\(\pi(x)\)微就行了然后直接\(u\textdv=uv-v\textdu\)18.3k……阿巴阿巴引言这玩意挺常见的。而且你会......
  • 每日食词—day020
    StatusBarn.状态栏、运行状况工具栏transitionn. v.转换、转变measurementn.测量值、检测、措施concatn.合并,拼接invocationn.调用uncaughtadj.......
  • 每日食词—day019
    residualadj. n.剩余、残余的、残差、误差newfilev. n.新文件、新建文件livestreamn.现场直播、视频直播、直播频道trien.字典树、前缀树、单词查找树......
  • 每日食词—day018
    singletonn.单件、单例whetherconj. pron.是否、有无、无论、不管targetn.目标、指标supernettingn.超网constn.常量、常数、固定unitn.单位......
  • 每日食词—day017
    displayv. n.显示、展示、陈列、显示器enumeratingn.枚举、列举、穷举法replacementn.替换、替代、置换denominatorn.分母humidityn.湿度、潮湿、......
  • 初级数论1:(扩展)欧几里得算法
    初级数论第一节:欧几里得算法,扩展欧几里得算法,例题。这是你也能看懂的数论。欧几里得算法首先讲一下欧几里得算法欧几里得算法是可以在$O(\log_n)$时间内求解两数最大......
  • 数论分块
    数论分块首先我们需要知道数论分块的用途:它可以快速计算含有除法向下取整的和式。形如\(\sum_{i=1}^{n}f(i)g(\lfloor{\frac{n}{i}}\rfloor)\).为什么可以快速计算呢,因为......