小标题的超链接为原题链接,点击跳转
数论知识点小汇总:
- gcd
- lcm
- 欧几里得算法
- 中国剩余定理
- 唯一分解定理
- 约数定理
6.1 基础数论
等差数列
题目
代码
#include<bits/stdc++.h>
#include<iostream>
using namespace std;
#define long long int
const int N = 1e5+10;
int a[N], d[N];
int n;
int gcd(int a, int b)
{
return b == 0 ? a : gcd(b, a % b);
}
int lcm(int a, int b)
{
return a * b / gcd(a, b);
}
int main()
{
cin >> n;
for(int i=1; i<=n; i++) // 读入数组
cin >> a[i];
sort(a+1, a+n+1); // 排序
for(int i=2; i<=n; i++) // 计算公差
d[i-1] = a[i] - a[i-1];
if(count(d+1, d+n, 0)) // 常数列
{
cout << n << endl;
return 0;
}
int ans = d[1];
for(int i=2; i<n; i++) // 计算最大公约数
{
ans = gcd(ans, d[i]);
}
// 计算序列长度
cout << (a[n] - a[1])/ans + 1 << endl;
return 0;
}
阶乘约数
题目
代码
// 阶乘约数
#include<iostream>
#include<map>
using namespace std;
typedef long long ll;
map<int, int> m;
ll ans = 1;
int n = 100;
void f(int x)
{
int i = 2;
while(x > 1)
{
if(x%i == 0)
{
m[i]++;
x /= i;
}
else
{
i++;
}
}
if(x != 1) m[x]++;
return;
}
int main()
{
for(int i=1; i<=n; i++)
{
f(i);
}
for(auto it = m.begin(); it!=m.end(); it++)
{
ans *= it->second + 1;
}
cout << ans;
}