求约数
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int n;
void get(int x)
{
vector<int> q;
for (int i = 1;i <= x / i;i++)
{
if (x % i == 0)
{
q.push_back(i);
if(i!=x/i) //避免重复放入
q.push_back(x / i);
}
}
sort(q.begin(), q.end());
for (int i = 0;i < q.size();i++)
cout << q[i] << ' ';
cout << '\n';
}
int main()
{
cin >> n;
while (n--)
{
int a;
cin >> a;
get(a);
}
}
约数个数
#include <iostream>
#include <algorithm>
#include <unordered_map>
using namespace std;
const int MOD=1e9+7;
/*运用约数的个数的定理:
我们只要记录每一个数的质因子的个数和他们相应的质数----->应用求质因子算法
然后把他们相加
最后用组合数学,就可以得出他们的乘积的约数个数
*/
unordered_map <int, int> mp;
void get(int a)
{
for (int i = 2;i <= a / i;i++)
if (a % i == 0)
{
int s = 0;
while (a % i == 0)
{
a /= i;
s++;
}
mp[i] += s;
}
if (a > 1) mp[a]++;
}
typedef long long ll;
int main()
{
int n;
cin >> n;
while (n--)
{
int a;
cin >> a;
get(a);
}
ll res = 1;
for (auto t : mp)
{
res =(res* (t.second + 1))%MOD;
}
cout << res;
}
约数之和
t=t*a+1的意义
#include <iostream>
#include <algorithm>
#include <unordered_map>
using namespace std;
/*运用约数的个数的定理:
我们只要记录每一个数的质因子的个数和他们相应的质数----->应用求质因子算法
然后把他们相加
最后用组合数学,就可以得出他们的乘积的约数个数
*/
const int mod = 1e9 + 7;
unordered_map <int, int> mp;
void get(int a)
{
for (int i = 2;i <= a / i;i++)
if (a % i == 0)
{
int s = 0;
while (a % i == 0)
{
a /= i;
s++;
}
mp[i] += s;
}
if (a > 1) mp[a]++;
}
typedef long long ll;
int main()
{
int n;
cin >> n;
while (n--)
{
int a;
cin >> a;
get(a);
}
ll res = 1;
for (auto t : mp)
{
ll q = 1;
ll a = t.first, b = t.second;
//可能会爆int,转化为ll
while (b--)
q = (q * a + 1) % mod;
//这里用模拟乘法也可以,直接用等比数列求和会爆int,不建议
res = (res * q) % mod;
}
cout << res % mod;
}
最大公约数
最大公因数,也称最大公约数、最大公因子,指两个或多个整数共有约数中最大的一个。a,b的最大公约数记为(a,b),同样的,a,b,c的最大公约数记为(a,b,c),多个整数的最大公约数也有同样的记号。
方法:辗转相除法
(a,b)=(b,a%b) a和b的最大公约数和约数=b和a%b的最大公约数和约数
证明
#include <iostream>
using namespace std;
int gcd(int a,int b)
{
if(!b) //b==0
return a;
else
return gcd(b,a%b);
}
int main()
{
int n;
cin>>n;
while(n--)
{
int a,b;
cin>>a>>b;
cout<<gcd(a,b)<<endl;
}
}
关于最大公约数的定理
裴蜀定理:ax+by=d; a,b是任意常数 d是a和b的最大公约数的倍数
在数论中,裴蜀定理是一个关于最大公约数(或最大公约式)的定理。裴蜀定理得名于法国数学家艾蒂安·裴蜀,说明了对任何整数a、b和它们的最大公约数d,关于未知数x和y的线性丢番图方程(称为裴蜀等式):
ax + by = m
有解当且仅当m是d的倍数。裴蜀等式有解时必然有无穷多个整数解,每组解x、y都称为裴蜀数,可用辗转相除法求得。
例如,12和42的最大公因子是6,则方程12x + 42y = 6有解。事实上有(-3)×12 + 1×42 = 6及4×12 + (-1)×42 = 6。
特别来说,方程 ax + by = 1 有解当且仅当整数a和b互素。