1、质数
Acwing868. 筛质数
给定一个正整数
n
n
n,请你求出
1
∼
n
1∼n
1∼n 中质数的个数。
输入格式
共一行,包含整数
n
n
n。
输出格式
共一行,包含一个整数,表示
1
∼
n
1∼n
1∼n 中质数的个数。
数据范围
1
≤
n
≤
106
1\leq n\leq106
1≤n≤106
输入样例:
8
8
8
输出样例:
4
4
4
解法一:朴素筛法
#include<bits/stdc++.h>
using namespace std;
int n;
const int N = 1e6+10;
int prime[N],cnt;
bool st[N];
void divide(int n){
for(int i =2 ;i <=n ;i ++){
if(st[i]) continue;
prime[cnt++] = i;
for(int j = i+i;j<=n ;j +=i){
st[j] = true;
}
}
}
int main(){
scanf("%d",&n);
divide(n);
cout << cnt;
return 0;
}
解法二:线性筛法
#include<bits/stdc++.h>
using namespace std;
int n;
const int N = 1e6+10;
int prime[N],cnt;
bool st[N];
void divide(int n){
for(int i =2 ;i <=n ;i ++){
if(!st[i]) prime[cnt++] = i;
for(int j = 0 ;prime[j]<=n/i;j++){
st[prime[j]*i] = true;
if(i%prime[j]==0) break;
}
}
}
int main(){
scanf("%d",&n);
divide(n);
cout << cnt;
return 0;
}
2、约数
Acwing869. 试除法求约数
给定
n
n
n 个正整数
a
i
a_{i}
ai,对于每个整数
a
i
a_{i}
ai,请你按照从小到大的顺序输出它的所有约数。
输入格式
第一行包含整数
n
n
n。
接下来 n n n 行,每行包含一个整数 a i a_i ai。
输出格式
输出共
n
n
n 行,其中第
i
i
i 行输出第
i
i
i 个整数
a
i
a_i
ai 的所有约数。
数据范围
1
≤
n
≤
100
1\leq n\leq100
1≤n≤100,
2
≤
a
i
≤
2
×
1
0
9
2\leq a_i\leq2\times10^9
2≤ai≤2×109
输入样例:
2
6
8
输出样例:
1 2 3 6
1 2 4 8
#include<bits/stdc++.h>
using namespace std;
int main(){
int t ;
scanf("%d", &t);
while (t -- ){
int n;
stack<int> st;
scanf("%d", &n);
for(int i = 1 ;i<=n/i ; i++){
if(n%i == 0) {
printf("%d ",i);
if(n/i!=i){
st.push(n/i);
}
}
}
while(st.size()){
printf("%d ",st.top());
st.pop();
}
puts("");
}
return 0;
}
3、欧拉函数
4、快速幂
求 a 的 b 次方对 p 取模的值。
输入格式
三个整数
a
,
b
,
p
a,b,p
a,b,p ,在同一行用空格隔开。
输出格式
输出一个整数,表示
a
b
m
o
d
p
a^b \mod p
abmodp的值。
数据范围
0
≤
a
,
b
≤
1
0
9
0\leq a,b\leq 10^9
0≤a,b≤109
1
≤
p
≤
1
0
9
1\leq p\leq 10^9
1≤p≤109
输入样例:
3 2 7
输出样例:
2
#include<bits/stdc++.h>
using namespace std;
int a,b,p;
int main(){
scanf("%d%d%d",&a,&b,&p);
long long res = 1;
while(b){
if(b&1) {
res = a *res%p;
}
a = (long long )a*a%p;
b/=2;
}
printf("%lld",res%p);
return 0;
}