上午: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;
}
优先队列,可重复集合应用
集合
优先队列
(不理解)
零碎
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]这样插入
2.typedef long long int;
define int long long