50pts求助
  • 板块P4626 一道水题 II
  • 楼主ppip喵喵喵
  • 当前回复7
  • 已保存回复7
  • 发布时间2021/7/11 08:27
  • 上次更新2023/11/4 15:06:51
查看原帖
50pts求助
374433
ppip喵喵喵楼主2021/7/11 08:27

保证表没问题

#include <iostream>
#include <cstdio>
#include <bitset>
#include <vector>
using namespace std;
const int MAXN=1e6+5;
const int f[500]={0,1,4279041,78522927,97275812,6626498,90103459,19755829,89404363,31420837,78259116,79495350,63384896,76365496,77671792,60888616,14364168,69179499,73237343,47511561,98202707,9638787,8923490,19377161,14025453,83914297,99211028,91698985,11861010,41728948,85011248,2957451,96835040,13279739,65389333,35674577,69539515,43558531,90167843,65612508,96727630,84411969,10432978,81144826,76822534,44673268,48780356,42026053,71419640,925833,75468296,56122076,11730540,24214526,57670707,87561236,60795551,16258057,38969193,93135220,99449198,86687779,48716439,54282180,9747238,6014664,88132693,90624798,78394444,54259153,2424434,71634841,6763549,80339105,74090298,10910559,39590831,57807866,78084208,54389248,4052287,74604335,99190428,89368783,73470487,32097770,29222100,30538785,3048397,89311543,48798411,36895907,88691881,24323948,4724247,97882710,84490696,93965490,66087028,92642640,55440368};
const int b6e0=1e8+7;
const int m=1e6;
bitset <MAXN> p;
vector <int> pr;
void ola(int n)
{
    p.set();
    pr.clear();
    p[1]=0;
    for (int i=2;i<=n;++i)
    {
        if (p[i]) pr.push_back(i);
        for (int j=0;j<pr.size()&&i*pr[j]<=n;++j)
        {
            p[i*pr[j]]=0;
            if (i%pr[j]==0) break;
        }
    }
}
typedef long long ll;
ll calc(int p,int n)
{
    ll ans=p;
    while (ans*p<=n) ans*=p;
    return ans;
}
int main()
{
    // freopen("std.in","r",stdin);
    // freopen("ex.out","w",stdout);
    int n;
    cin>>n;
    int ans=1;
    if (n<=m)
    {
        ola(n);
        for (int i=0;i<pr.size();++i) ans=calc(pr[i],n)*ans%b6e0;
    }
    else
    {
        ola(m);
        for (int i=0;i<pr.size();++i) ans=calc(pr[i],m)*ans%b6e0;
        int id=(n-1)/m;
        ans=1ll*ans*f[id]%b6e0;
		ll L=id*m+1,R=n;
        for (int i=0;i<=R-L;++i) p[i]=0;
		for (int i=0;i<pr.size()&&pr[i]*pr[i]<=R;++i)
		{
			int l=L/pr[i]*pr[i];
            if (l<L) l+=pr[i];
			while (l<=R) p[l-L]=1,l+=pr[i];
		}
		for(int i=L;i<=R;++i)
			if(!p[i-L]) ans=1ll*ans*i%b6e0;
		// printf("%d\n",ans);
    }
    printf("%d",ans);
    return 0;
}
2021/7/11 08:27
加载中...