UVA967的题解
设
显然答案为
注意到
那么就可以先把
代码很好写。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define db double
#define ull unsigned long long
#define INF 1e9
#define eps 1e-15
using namespace std;
const int N=1e7+10;
const int M=1e6+10;
const ll mod=998244353;
int n,m,q,T;
int vis[N];
int prime[N],cnt;
int check[N];
int num[10],tot;
int pre[N];
int calc(int x)//计算位数
{
int res=0;
while(x)
{
res++;
x/=10;
}
return res;
}
int rotate(int x,int ws)
{
int qwq=1;
for(int i=1;i<ws;i++) qwq*=10;
int p=x%10;
x/=10;
return p*qwq+x;
}
void make(int x,int ws)
{
tot=0;
for(int i=1;i<=ws;i++)
x=rotate(x,ws),num[++tot]=x;
}
bool judge()
{
for(int i=1;i<=tot;i++)
if(vis[num[i]]) return 0;
return 1;
}
void init()
{
for(int i=2;i<=N;i++)
{
if(!vis[i]) prime[++cnt]=i;
for(int j=1;j<=cnt&&i*prime[j]<=N;j++)
{
vis[i*prime[j]]=1;
if(i%prime[j]==0) break;
}
}
for(int i=1;i<=1e6;i++)
{
if(check[i]) continue;
make(i,calc(i));
if(judge())
for(int j=1;j<=tot;j++) check[num[j]]=1;
}
for(int i=1;i<=1e6;i++) pre[i]=pre[i-1]+check[i];
}
signed main()
{
init();
int x,y;
while(scanf("%d",&x)&&x!=-1)
{
scanf("%d",&y);
int ans=pre[y]-pre[x-1];
if(!ans) printf("No Circular Primes.\n");
else if(ans==1) printf("1 Circular Prime.\n");
else printf("%d Circular Primes.\n",ans);
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构