1 条题解

  • 0
    @ 2026-7-4 11:05:38

    #include <cstdio>
    #define int long long
    const int M = 300005;
    int read()
    {
    	int x=0,f=1;char c;
    	while((c=getchar())<'0' || c>'9') {if(c=='-') f=-1;}
    	while(c>='0' && c<='9') {x=(x<<3)+(x<<1)+(c^48);c=getchar();}
    	return x*f;
    }
    int n,a,b,L,R,cnt,p[M],mu[M],vis[M];
    void init(int n)
    {
    	mu[1]=1;
    	for(int i=2;i<=n;i++)
    	{
    		if(!vis[i]) p[++cnt]=i,mu[i]=-1;
    		for(int j=1;j<=cnt && i*p[j]<=n;j++)
    		{
    			vis[i*p[j]]=1;
    			if(i%p[j]==0) break;
    			mu[i*p[j]]=-mu[i];
    		}
    	}
    }
    void print(int x)
    {
    	if(L>R || x>n) return ;
    	if(L==1) printf("%lld ",x),R--;
    	else L--,R--;
    }
    void pall(int x,int y)
    {
    	if(x+y>n) return ;
    	pall(x,x+y);print(x+y);pall(x+y,y);
    }
    int cal(int p,int q)
    {
    	int r=0;
    	for(int i=1;p+q<=n/i;i++)
    	{
    		if(!mu[i]) continue;
    		for(int j=1;p*j+q<=n/i;j++)
    			r+=mu[i]*(n/i-p*j)/q;
    	}
    	return r;
    }
    void dfs(int a,int b)
    {
    	int m=cal(a,b);
    	if(L>R || !m) return ;
    	if(L>m) {L-=m;R-=m;return ;}
    	if(L==1 && m<=R) {pall(a,b);return ;}
    	dfs(a,a+b);print(a+b);dfs(a+b,b);
    }
    signed main()
    {
    	a=read();b=read();n=read();L=read();R=read();
    	init(n);
    	print(a);dfs(a,b);print(b);
    }
    
    
    • 1

    信息

    ID
    9233
    时间
    4000ms
    内存
    1024MiB
    难度
    10
    标签
    递交数
    2
    已通过
    1
    上传者