上午:contest2补题;
下午:vj比赛
晚上:acwing数学约数+最短路问题。

约数个数

const int mod=1e9+7,998244353
for(int i=2; i<=x; i++)
{
	while(x%i==0)
	{
		x/=i;
		primes[i]++;
	}
	if(x>1)
		primes[x]++;
	long long res=1;
	for(auto prime:primes)
		res*=(prime.second+1)%mod;
	cout<<res;

}

约数之和

for(int i=2; i<=x; i++)
{
	while(x%i==0)
	{
		x/=i;
		primes[i]++;
	}
	if(x>1)
		primes[x]++;
	long long res=1;
	//只有以下不同
	for(auto prime:primes)
	{
		int p=prime.first,a=prime.second;
		long long t=1;
		while(a--)
		{
			t=t*p+1;
			res=res*t%mod;
		}
		
	 } 
	 cout<<res<<endl;

}

求两个数之间的约数和tle版

#include<bits/stdc++.h>
using namespace std;

long long find(long long x)
{
    map<int, int> primes;
    for(int i=2; i*i <= x; i++)
    {
        while(x % i == 0)
        {
            primes[i]++;
            x /= i;
        }
    }
    if(x > 1)
        primes[x]++;
    
    long long res = 1;
    for(auto prime : primes)
    {
        long long base = 1;
        for(int i = 0; i < prime.second; i++)
        {
            base = base * prime.first + 1;
        }
        res *= base;
    }
    return res;
}

int main()
{
    long long x, y;
    cin >> x >> y;
    long long sum = 0;

    for(long long i = x; i <= y; i++)
    {
        sum += find(i);
    }

    cout << sum << endl;
    return 0;
}

ac版本

#include<bits/stdc++.h>
using namespace std;
#define int unsigned long long
int a,b;
int get(int n)
{
	int ans=0;
	for(int l=1,r;l<=n;l=r+1)
	{
		r=n/(n/l);
		ans+=n/l*(l+r)*(r-l+1)/2;
		
	}
	return ans;
}
signed main()
{
	while(cin>>a>>b)
	cout<<get(b)-get(a-1)<<endl;
}

image

优先队列,可重复集合应用

集合

image

优先队列

image
image

image

(不理解)

零碎

1.使用map时不需要定义大小。
pair<int, int> p1[]{ {1,3},{2,5},{3,7} };
但是对于map
map<int, int> myMap = { {1, 3}, {2, 5}, {3, 7} }
map也可以直接mp[1]这样插入

image
2.typedef long long int;
define int long long

posted on 2024-07-20 08:03  Hoshino1  阅读(2)  评论(0编辑  收藏  举报