题目大意,求多组
在2154: Crash的数字表格中,得到可以由式子(x是n,y是m,打错了...)
推得,但是多组数据肯定要超时。
考虑优化,令D = k*d有
那么就可以预处理出后面那一团,在时间算出答案
对于预处理这一团考虑令D为当前需求数,k为其最小质因子
有
所以可以直接在线性筛时根据mu值求出这一团(不想写公式了)...
c++代码如下:
#include<bits/stdc++.h>
#define rep(i,x,y) for(register int i = x ;i <= y;++ i)
#define repd(i,x,y) for(register int i = x ;i >= y;-- i)
using namespace std;
typedef long long ll;
template<typename T>inline void read(T&x)
{
x = 0;char c;int sign = 1;
do { c = getchar(); if(c == '-') sign = -1; }while(!isdigit(c));
do { x = x * 10 + c - '0'; c = getchar(); }while(isdigit(c));
x *= sign;
}
const int N = 1e7 + 500,p = 1e8+9;
int sum[N],prime[N],cnt,ans,n,m;
bool vis[N];
inline void pre()
{
sum[1] = 1;int t = 1e7;
rep(i,2,t)
{
if(!vis[i]) { prime[++cnt] = i; sum[i] = ((1*1*i-1LL*i*i)%p+p)%p ; }
for(register int j = 1;(ll)prime[j] * i <= t; ++ j)
{
vis[prime[j] * i] = 1;
if(i % prime[j] == 0) { sum[i * prime[j]] = 1LL * prime[j] * sum[i] % p; break; }
sum[i * prime[j]] = ((1LL * sum[i] * prime[j] % p - 1LL * sum[i] * prime[j] % p * prime[j] % p) % p + p) % p;
}
sum[i] = (sum[i - 1] + sum[i] )%p;
}
}
inline int get(int x,int y) { return (1LL * x * (x + 1)) / 2 % p * ((1LL * y * (y + 1)) / 2 % p) %p; }
inline void solve(int n,int m)
{
for(register int i = 1,lst;i <= min(n,m);i = lst + 1)
{
lst = min(m/(m/i),n/(n/i));
ans = (ans + 1LL*get(n/i,m/i)*((1LL*sum[lst] - sum[i - 1])%p+p)%p) %p;
}
}
int main()
{
pre();
int t;
read(t);
while(t--)
{
ans = 0;
read(n); read(m);
solve(n,m);
printf("%d\n",ans);
}
return 0;
}