AcWing 866. 试除法判定质数
1.题意:
2.题解:
3.ac代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int a[N];
bool st[N];
int primes[N];
int tot;
bool is_prime(int n){
if(n<2) return 0;
for(int i=2;i<=n/i;i++){
if(n%i==0) return 0;
}
return 1;
// else return 0;
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
if(is_prime(a[i]))cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
}
AcWing 867. 分解质因数
1.题意:
2.题解:
考虑小于4的情况,大于根号n的质因数最多有一个
3.ac代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int a[N];
bool st[N];
int primes[N];
int tot;
void divide(int n){
if(n<=3) cout<<n<<" "<<1<<endl;
for(int i=2;i<=n/i;i++){
if(n%i==0){
int s=0;
while(n%i==0){
n/=i;s++;
}
cout<<i<<" "<<s<<endl;
}
}
if(n>1) cout<<n<<" "<<1<<endl;
cout<<endl;
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
divide(a[i]);
}
}
AcWing 868. 筛质数
1.题意:
2.题解:
1不是质数,线性筛
3.ac代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int a[N];
bool st[N];
int primes[N];
int tot;
void get_prime(int n){
for(int i=2;i<=n;i++){
if(!st[i]) primes[tot++]=i;
for(int j=0;primes[j]<=n/i;j++){
st[primes[j]*i]=1;
if(i%primes[j]==0) break;
}
}
}
int main(){
int n;
cin>>n;
get_prime(n);
cout<<tot<<endl;
}
AcWing 869. 试除法求约数
1.题意:
2.题解:
3.ac代码:
#include<bits/stdc++.h>
#include<vector>
using namespace std;
const int N=1e6+10;
int a[N];
bool st[N];
int primes[N];
int tot;
void get_divisors(int n){
vector<int> v;
for(int i=2;i<=n/i;i++){
if(n%i==0) {
v.push_back(i);
if(i!=n/i)
v.push_back(n/i);
}
}
v.push_back(1);
if(n!=1)
v.push_back(n);
sort(v.begin(),v.end());
for(int i=0;i<v.size();i++){
cout<<v[i]<<" ";
}
cout<<endl;
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
get_divisors(a[i]);
}
}
AcWing 870. 约数个数
1.题意:
2.题解:
记得开longlong,公式
3.ac代码:
#include<bits/stdc++.h>
#include<vector>
#include<unordered_map>
using namespace std;
typedef long long ll;
const int N=1e6+10;
int a[N];
int mod=1e9+7;
bool st[N];
int primes[N];
int tot;
unordered_map<int,int> m;
ll res=1;
void get_sum(int n){
for(int i=2;i<=n/i;i++){
if(n%i==0){
int s=0;
while(n%i==0){
n/=i;s++;
}
m[i]+=s;
}
}
if(n>1) m[n]+=1;
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
get_sum(a[i]);
}
for(auto x:m){
res=res*(x.second+1)%mod;
}
cout<<res<<endl;
}
AcWing 871. 约数之和
1.题意:
2.题解:
3.ac代码:
#include<bits/stdc++.h>
#include<vector>
#include<unordered_map>
using namespace std;
typedef long long ll;
const int N=1e6+10;
int a[N];
int mod=1e9+7;
bool st[N];
int primes[N];
int tot;
unordered_map<int,int> m;
ll res=1;
void get_sum(int n){
for(int i=2;i<=n/i;i++){
if(n%i==0){
int s=0;
while(n%i==0){
n/=i;s++;
}
m[i]+=s;
}
}
if(n>1) m[n]+=1;
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
get_sum(a[i]);
}
for(auto x:m){
ll sum=0;
int p=x.first;
for(int i=0;i<=x.second;i++){
sum=(sum*p+1)%mod;
}
res=res*sum%mod;
}
cout<<res<<endl;
}
AcWing 872. 最大公约数
1.题意:
2.题解:
gcd(a,b)=gcd(b,a%b)
3.ac代码:
#include<bits/stdc++.h>
#include<vector>
#include<unordered_map>
using namespace std;
typedef long long ll;
const int N=1e6+10;
int a[N];
int gcd(int a,int b){
return b?gcd(b,a%b):a;
}
int main(){
int n;
cin>>n;
int a,b;
for(int i=1;i<=n;i++){
cin>>a>>b;
cout<<gcd(a,b)<<endl;
}
}
AcWing 873. 欧拉函数
1.题意:
2.题解:
3.ac代码:
#include<bits/stdc++.h>
#include<vector>
#include<unordered_map>
using namespace std;
typedef long long ll;
const int N=1e6+10;
int a[N];
int get_oula(int n){
int res=n;
for(int i=2;i<=n/i;i++){
if(n%i==0){
int s=0;
while(n%i==0){
n=n/i;s++;
}
res=res/i*(i-1);
}
}
if(n>1) res=res/n*(n-1);
return res;
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
cout<<get_oula(a[i])<<endl;
}
}
AcWing 874. 筛法求欧拉函数
1.题意:
2.题解:
!分清求约数(n/i)和求质数(n)不同算法
对于线性求质数,对每一个i都要遍历一遍primes[j]
3.ac代码:
#include<bits/stdc++.h>
#include<vector>
#include<unordered_map>
using namespace std;
typedef long long ll;
const int N=1e6+10;
int a[N];
bool st[N];
int primes[N];
int tot;
ll res=0;
int phi[N];
void get_oula(int n){
for(int i=2;i<=n;i++){
if(!st[i]){
primes[tot++]=i;
phi[i]=i-1;
}
for(int j=0;primes[j]<=n/i;j++){
st[primes[j]*i]=1;
if(i%primes[j]==0){
phi[primes[j]*i]=primes[j]*phi[i];
break;
}
phi[primes[j]*i]=(primes[j]-1)*phi[i];
}
}
}
int main(){
int n;
cin>>n;
get_oula(n);
phi[1]=1;//!!!!
for(int i=1;i<=n;i++){
res+=phi[i];
}
cout<<res<<endl;
}