约数的运用

点击这里^ - ^,有奇迹哟

869.试除法求约数

给定\(n\)个正整数\(a_i\),对于每个整数\(a_i\),请你按照从小到大的顺序输出它的所有约数。
输入格式
第一行包含整数\(n\)
接下来\(n\),每行包含一个整数\(a_i\)
输出格式
输出共\(n\)行,其中第\(i\)行输出第\(i\)个整数\(a_i\)个整数\(a_i\)的所有约数。、
数据范围
\(1\leq n\leq100,2\leq a_i\leq 2\times10^9\)

思路:直接遍历筛即可。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define endl '\n'
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define _for(i, a, b) for (int i=(a); i<=(b); i++)
const int INF = 0x7fffffff;
const int MAXN = 2e5 + 10;

int n;
ll a;

int main(){
	IOS;
	cin >> n;
	while(n--){
		int t = 0;
		cin >> a;
		for(int i = 1; i <= sqrt(a); i++){
			if(a % i == 0) cout << i << " ";
		}
		int res = sqrt(a);
		if(res * res == a) t = res - 1;
		else t = res;
		for(int i = t; i >= 1; i--){
			if(a % i == 0) cout << a/i << " ";
		}
		cout << endl;
	}
	return 0;
}

872.最大公约数

给定\(n\)对正整数\(a_i,b_i\),请你求出没对数的最大公约数
输入格式
第一行包含整数\(n,1\leq n \leq 10^5\)
接下来\(n\)行,每行包含一个整数对\(a_i,b_i\),\(1\leq a_i,b_i\leq2\times10^9\)
输出格式
输出\(n\)行,每行输出一个整数对的最大公约数。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define endl '\n'
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define _for(i, a, b) for (int i=(a); i<=(b); i++)
const int INF = 0x7fffffff;
const int MAXN = 2e5 + 10;

int n, res;
ll a, b;
ll gcd(ll a, ll b){
	if(b == 0)  return a;
	else gcd(b, a%b);
} 

int main(){
	cin >> n;
	while(n--){
		cin >> a >> b;
		cout << gcd(a,b) << endl;
	}
	return 0;
}

870.约数个数

给定\(n\)的正整数\(a_i\),请你输出这些数的乘积的约数个数,答案对\(10^9+7\)取模。
输入格式
第一行包含整数\(n\)
接下来\(n\)行,每行包含一个整数\(a_i\)
输出格式
输出一个整数,表示所给正整数的乘积的约数个数,答案对\(10^9+7\)取模。数据范围
\(1\leq n\leq100,2\leq a_i\leq 2\times10^9\)

思路:对整数\(a_i\)让其始终被其最小的素数整除,并记录这个素数的个数,(最好使用\(map\)存储,方便)然后代入公式计算即可。

#include <bits/stdc++.h>
#include <map>
using namespace std;
typedef long long ll;
#define endl '\n'
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define _for(i, a, b) for (int i=(a); i<=(b); i++)
const int INF = 0x7fffffff;
const int MAXN = 1e6 + 10;
const ll mod = 1e9 + 7;

int main(){
	int n, x;
	ll res = 1;
	cin >> n;
	map<int,int>ma;
	map<int,int>::iterator iter;
	while(n--){
		cin >> x;
		for(int i = 2;  i <= x / i; i++){
			while(x % i == 0){
				x /= i;
				ma[i]++;
			}
		}
		if(x > 1) ma[x]++; 
	}
	for(iter = ma.begin(); iter != ma.end(); iter++){
		res = res * (iter->second + 1) % mod;
	} 
	cout << res;
	return 0;
}

871.约数之和

给定\(n\)的正整数\(a_i\),请你输出这些数的乘积的约数之和,答案对\(10^9+7\)取模。
输入格式
第一行包含整数\(n\)
接下来\(n\)行,每行包含一个整数\(a_i\)
输出格式
输出一个整数,表示所给正整数的乘积的约数个数,答案对\(10^9+7\)取模。数据范围
\(1\leq n\leq100,2\leq a_i\leq 2\times10^9\)

思路:对整数\(a_i\)让其始终被其最小的素数整除,并记录这个素数的个数,(最好使用\(map\)存储,方便)然后代入公式计算即可。

#include <bits/stdc++.h>
#include <map>
using namespace std;
typedef long long ll;
#define endl '\n'
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define _for(i, a, b) for (int i=(a); i<=(b); i++)
const int INF = 0x7fffffff;
const int MAXN = 1e6 + 10;
const ll mod = 1e9 + 7;

ll fastpow(int a, int n){
	ll res = 1;
	while(n){
		if(n & 1) res = ((res % mod) * (a % mod)) % mod;
		a = ((a % mod) * (a % mod)) % mod;
		n >>= 1;
	}
	return res % mod;
}

int main(){
	int n, x;
	ll res = 0, ans = 1;
	cin >> n;
	map<int,int>ma;
	map<int,int>::iterator iter;
	while(n--){
		cin >> x;
		for(int i = 2;  i <= x / i; i++){
			while(x % i == 0){
				x /= i;
				ma[i]++;
			}
		}
		if(x > 1) ma[x]++; 
	}
	for(iter = ma.begin(); iter != ma.end(); iter++){
		res = 0;
		for(int i = 0; i <= iter->second; i++){
			res = ((res % mod) + (fastpow(iter->first,i) % mod)) % mod;
		}
		ans = ((ans % mod) * (res % mod) % mod);
	} 
	cout << ans % mod;
	return 0;
}
posted @ 2021-05-19 09:20  h星宇  阅读(72)  评论(0编辑  收藏  举报