2080 特殊的质数肋骨 USACO (深度优先搜索)
农民约翰的母牛总是产生最好的肋骨。 你能通过农民约翰和美国农业部标记在每根肋骨上的数字认出它们。 农民约翰确定他卖给买方的是真正的质数肋骨,是因为从右边开始切下肋骨,每次还剩下的肋骨上的数字都组成一个质数,举例来说: 7 3 3 1 全部肋骨上的数字 7331是质数;三根肋骨 733是质数;二根肋骨 73 是质数;当然,最后一根肋骨 7 也是质数。 7331 被叫做长度 4 的特殊质数。 写一个程序对给定的肋骨的数目 N(1<=N<=8),求出所有的特殊质数。 数字1不被看作一个质数。
思路:第一个数字肯定是2,3,5,7. 那么后面的数字都是在1,3,7,9中寻找的,就是一个简单的搜索。那怎么判断是否为素数,我直接用了米勒拉宾判断。
#include<cstdio> #include<iostream> typedef long long LL; using namespace std; int num[4] = { 1, 3, 7, 9 }; int n; LL mulmod(LL a, LL b, LL p) { LL d = 1; a = a%p; while (b>0) { if (b & 1) d = (d*a) % p; a = (a*a) % p; b >>= 1; } return d; } bool witness(LL a, LL n) { LL d = n - 1; if (n == 2) return true; if (!(n & 1)) return false; while (!(d & 1)) d = d / 2; LL t = mulmod(a, d, n); while ((d != n - 1) && (t != 1) && (t != n - 1)) { t = mulmod(t, 2, n); d = d << 1; } return (t == n - 1) || (d & 1); } bool isprime(LL n) { int a[3] = { 2, 7, 61 }; for (int i = 0; i<3; i++) if (!witness(a[i], n)) return false; return true; } void dfs(int x, int m) { if (x == n){ printf("%d\n", m); return; } for (int i = 0; i < 4; ++i) { if (isprime(m * 10 + num[i])){ dfs(x + 1, m * 10 + num[i]); } } } int main() { scanf("%d", &n); dfs(1, 2); dfs(1, 3); dfs(1, 5); dfs(1, 7); }
作者:ALINGMAOMAO
出处:https://www.cnblogs.com/ALINGMAOMAO/p/10050127.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探