【题解】洛谷 P5946 [POI2002]B-Smooth 数
感觉这题还是挺神的。
设
那么:
解释一下:
首先
然后第二个式子:显然我们可以把
由于递归的层数可以带替
可能需要一点优化,都在代码里了:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int MAX=1e6+10;
const int MOD=1e9+7;
inline char readchar() {
static char buf[100000], *p1 = buf, *p2 = buf;
return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 100000, stdin), p1 == p2) ? EOF : *p1++;
}
inline int read() {
#define readchar getchar
int res = 0, f = 0;
char ch = readchar();
for(; !isdigit(ch); ch = readchar()) if(ch == '-') f = 1;
for(; isdigit(ch);ch = readchar()) res = (res << 1) + (res << 3) + (ch ^ '0');
return f ? -res : res;
}
inline void write(int x) {
if(x<0){putchar('-');x=-x;}
if(x>9) write(x/10);
putchar(x%10+'0');
}
int n,m,p,sum;
int vis[MAX],cnt,pri[MAX];
inline int f(int c,int l,int r)
{
if(r<=pri[c])return r-l+1;
if(c==1)
{
return (int)(log(r)/log(2.0)+1.0+1e-6)-(int)(log(l-1)/log(2.0)+1.0+1e-6);
}
if(l==r)
{
int t=l;
for(int i=c;i>=1;i--) while(t%pri[i]==0) t/=pri[i];
if(t==1) return 1; return 0;
}
return f(c-1,l,r)+f(c,(l+pri[c]-1)/pri[c],r/pri[c]);
}
signed main()
{
n=read(),m=read(),p=read();
vis[1]=1;
for(int i=2;i<=p;i++)
{
if(!vis[i]) pri[++cnt]=i;
for(int j=1;j<=cnt&&pri[j]*i<=p;j++)
{
vis[i*pri[j]]=1;
if(i%pri[j]==0) break;
}
}
// for(int i=1;i<=cnt;i++) cout<<pri[i]<<" ";
cout<<f(cnt,n,n+m);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库