QAQ &火星情报局 哥德巴赫猜想 logn素数判定

来源:互联网 发布:js给标签删除属性 编辑:程序博客网 时间:2024/06/06 00:39

我对哥德巴赫猜想还是有点印象的。现代数学中1不在是素数。所以新的哥德巴赫猜想大致如下所述:(针对于大于2的数)

对于偶数,可以拆成两个素数的和。

对于奇数:

若是素数,就不再拆了。

若这个奇数可以拆成2和一个素数,那么这个数就可以拆成两个素数的和。

否则,剩余的一般奇数可以拆成3个素数的和。

不解释。

代码中有O(logn)的素数判定方法。

#include <iostream> #include <cmath>using namespace std; long long pow_mod(int a, long long d, long long mod) {long long res = 1, k = a;while(d) {if(d & 1) res = (res * k) % mod; k = k * k % mod;d >>= 1;} return res;}bool test(long long n, int a, long long d) {if(n == 2) return true;if(n == a) return true;if((n & 1) == 0) return false;while(!(d & 1)) d = d >> 1;long long t = pow_mod(a, d, n);while((d != n - 1) && (t != 1) && (t != n - 1)) {t = t * t % n;d <<= 1; }return (t == n - 1 || (d & 1) == 1);}bool isPrime(long long n) {if(n < 2LL) return false;int a[] = {2, 3, 61};for (int i = 0; i <= 2; ++i) if(!test(n, a[i], n - 1)) return false;return true; } int main(){ios::sync_with_stdio(false);int T;//for (int i = 2; i <= 100; ++i) if (isPrime(i)) cout << i << " "; //debug cin >> T;while(T--) {long long num;cin >> num;cout << ((num % 2 = 0) || isPrime(num) ? 1 : 2) << endl;}return 0;}

河南省多校连萌(三)C题


Welcome To HPU Online Judge!

问题 C: QAQ & 火星情报局

时间限制: 1 Sec  内存限制: 128 MB
提交: 182  解决: 22
[提交][状态][论坛]

题目描述

QAQ~超级喜欢看火星情报局,每周六都是他一周中最期待的一天,QAQ喜欢和自己一样心愿是“世界和平”的薛之谦,

喜欢“一言不合就飙车”的宇哥,喜欢“再扯的提案都能升华为鸡汤”的汪涵局长....当然也喜欢的里面各种各样奇葩有趣的提案.....

最近 K 星颁布了一项新的法律,所有 K 星的公民必须缴纳的所得税是收入 money 的最大因子 o 且 ( omoneyo≠money ) ,做为一名 ACMer QAQ~敏锐的发现可以把 money 拆分成若干个数的和(注 :拆分的数里不能出现 1)从而缴纳更少的所得税,当然这也是允许的,做为一名正直,勇敢,又充满正能量的 ACMer,K 决定把这个发现告诉火星情报局,以帮助 K 星完善这一新的法律。

“我发现...” 想想都很酷...,当然 QAQ 若想在世界都在看的火星上面提案是要通过多才多艺的”大家“的考核的,考核如下 :给出一个人的收入 money ,输出在 K 星该人可以缴纳的最少的所得税...为了帮助 QAQ 在火星顺提案你能帮他打下助攻吗?

输入

第一行一个数 TT ( 1T10001≤T≤1000),表示 T 组测试数据

接下来 TT 行,每行一个人的收入 money ( 2money10122≤money≤1012,注 :money 大部分是 106106 以内的数)

输出

对于每个 money 输出在 K 星可以缴纳的最少的所得税

样例输入

3258

样例输出

112

提示

2除自身的最大因子是1,输出为1

5除自身的最大因子是1,输出为1

8可以分成3+5 ,3除自身的最大因子是15除自身的最大因子是1,所以输出为1+1=2




原创粉丝点击