约数的运用
点击这里^ - ^,有奇迹哟
给定\(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;
}
给定\(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;
}
给定\(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;
}
给定\(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;
}