区间内逐个用欧拉函数求scoreTLE卡, 用了筛选法 WA卡, 用了long long WA又卡,最后又在网上看了看unsigned过了
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef unsigned long long ULL;
int in[100010][2];
ULL score[5000010];
void scor(int max_n)
{
memset(score, 0, sizeof score);
score[1] = 1;
for(int i = 2; i <= max_n; i++)
{
if(!score[i])
{
for(int j = i; j <= max_n; j+=i)
{
if(!score[j])
{
score[j] = j;
}
score[j] = score[j]/i*(i-1);
}
}
}
for(int i = 2; i <= max_n; i++)
{
score[i] = score[i] * score[i] + score[i-1];
}
}
int main()
{
int T, a, b, CA = 1, max_n = -1;
scanf("%d", &T);
for(int i = 0; i < T; i++)
{
scanf("%d%d", &a, &b);
in[i][0] = a, in[i][1] = b;
int mx = max(a, b);
max_n = max(mx, max_n);
}
scor(max_n);
for(int i = 0; i < T; i++)
{
printf("Case %d: %llu\n", CA++, score[in[i][1]] - score[in[i][0] - 1]);
}
return 0;
}