蜗牛

一步一步往上爬

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

试除法求约数

#include<bits/stdc++.h>

using namespace std;

int n;

void get_divisors(int n)
{
	vector<int> v;
	for( int i = 1; i <= n/i; i++ ){
		if(n%i==0){
			v.push_back(i);
//			避免i==n/i 重复放入 
			if(i!=n/i)
				v.push_back(n/i);
		}
	}
	sort(v.begin(), v.end());
	for(auto t: v)
		cout<<t<<' ';
}

int main()
{
	cin>>n;
	while(n--){
		int a;
		cin>>a;
		get_divisors(a);
		puts("");
	}
	
	return 0;
}

约数个数 约数之和

如果 N = p1^c1 * p2^c2 * ... *pk^ck
约数个数: (c1 + 1) * (c2 + 1) * ... * (ck + 1)
约数之和: (p1^0 + p1^1 + ... + p1^c1) * ... * (pk^0 + pk^1 + ... + pk^ck)

约数个数

#include<bits/stdc++.h>
#define x first
#define y second

using namespace std;

typedef long long LL;

const int mod = 1e9+7;

int n;

int main()
{
	cin>>n;
	unordered_map<int, int> m;
	while(n--){
		int a;
		cin>>a;
		for( int i = 2; i <= a/i; i++ )
			while(a%i==0){
				m[i]++;
				a/=i;
			}
//                a的最大公约数可能大于sqrt(a);
		if(a > 1)
				m[a]++;
	}
	LL res = 1;
	for(auto t: m){
		res = res*(t.y+1)%mod;
	}
	cout<<res<<endl;
	
	return 0;
}

约数之和

#include<bits/stdc++.h>
#define x first
#define y second

using namespace std;

typedef long long LL;

const int Mod = 1e9+7;

int n;

int main()
{
	cin>>n;
	unordered_map<int, int> m;
	while(n--){
		int a;
		cin>>a;
		for( int i = 2; i <= a/i; i++ )
			while(a%i==0){
				m[i]++;
				a/=i;
			}
		if(a > 1)
			m[a]++;
	}
	LL ans = 1;
	for(auto t: m){
		LL a = t.x, b = t.y;
		LL k = 1;
		while(b--)
			k = (k*a + 1)%Mod;
		ans = ans*k%Mod;
	}
	cout<<ans<<endl;
	
	return 0;
}

求最大公约数

辗转相除法
return b?gcd(b, a%b):a

#include<bits/stdc++.h>

using namespace std;

int n;

int gcd(int a, int b)
{
    return b?gcd(b, a%b):a;
}

int main()
{
    cin>>n;
    while(n--){
        int a, b;
        cin>>a>>b;
        cout<<gcd(a, b)<<endl;
    }
    
    return 0;
}
posted on 2021-10-12 18:56  对影丶成三人  阅读(14)  评论(0)    收藏  举报