根据定义,不难得出
筛一遍素数之后暴力统计即可
空间不够就压位筛
对于多次询问,观察到的指数均为1
可以求一遍乘积前缀和,将复杂度降为
最重要的是,这题模数是,不是!1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
using namespace std;
const int N=100000050,M=60;
const int mod=100000007;
struct node {int sz,id;};
LL used[N/M];
int prime[N>>3];
LL cnt=0,n,ans;
LL pow(LL a,LL b)
{
LL ret=1;
while (b)
{
if (b&1) ret=ret*a%mod;
a=a*a%mod,b>>=1;
}
return ret;
}
node F(int k) {return (node){k/M,k%M?k%M:M};}
int main()
{
scanf("%lld",&n),ans=1;
for(int i=2;i<=n;i++)
{
node x=F(i);
if ((used[x.sz]>>x.id)&1^1) prime[++cnt]=i;
for(int j=1;j<=cnt;j++)
{
if ((LL)i*prime[j]>n) break;
node w=F(i*prime[j]);
used[w.sz]|=1LL<<w.id;
if (i%prime[j]==0) break;
}
}
for(int i=cnt,k=1;i>0;i--)
{
LL x=pow(prime[i],k);
while ((LL)x*prime[i]<=n) k++,x*=prime[i];
ans=ans*x%mod;
}
printf("%lld\n",ans);
return 0;
}