1、Prime概述:1 的数 ,除了 1 和本身没有其他因子.1 既不是素数也不是合数,0 和所有的负整数同样如此.100 以内的素数2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,971.打表 (1)#define n 1000003int primen;/要判断的范围是多大,就要设置多大的数组, 对应于某个数,看它下标对应的数是 1,则是素数,否则,不是素数void getPrime()int i,j;int bound=sqrt(double)n);for(i=2;i1,b1)1);else if (!(
2、aelse return kgcd(abs(a-b),min(a,b);LCM (最小公倍数)LCM ( a, b ) = a * b / GCD ( a, b ) 实际上最好写成 a/GCD(a,b)*blong lcm(long a,long b)long c,d,sw;c=(a=b)?a:b;d=(a0?t:-t;e%=t;if(e1)res=res/x*(x-1);return res;中国剩余定理不管互质或者是不互质,只要在输入时进行互质处理, 即可. 而且,是_int64,显然通用性更强下面程序的输入输出格式:3/每组有几组数据3 2/除数 余数5 37 2#include usi
3、ng namespace std;_int64 x,y,t;_int64 extend_gcd(_int64 a,_int64 b) /return gcd(a,b) 得到 x,yif(b = 0)x = 1;y = 0;return a;else_int64 temp = extend_gcd(b,a%b);t = x; x = y;y = t - a/b*y;return temp;int main()_int64 a1,a2,r1,r2,c,gcd,temp;bool yes;int n;freopen(“G:/in.txt“,“r“,stdin);while(scanf(“%d“,sc
4、anf(“%I64d %I64d“,/a 是除数,r 是余数for(int i=0 ;i#include using namespace std;string week = “Saturday“, “Sunday“, “Monday“, “Tuesday“, “Wednesday“, “Thursday“, “Friday“;int day = 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31;/* 判断是否闰年 */bool isleap(intelse return false;/* 返回一年的最大天数 */int maxday(intel
5、se return 365;/* 得到年份 */int getyear(intwhile (days maxday(year)days -= maxday(year);year+;return year;/* 得到月份 */int getmonth(int year, intif (isleap(year) day2 = 29;else day2 = 28;while (days daymonth)days -= daymonth;month+;return month;/* 得到天数 */int getday(int/* 得到星期 */string getweek(int/* 主函数 */i
6、nt main()int days;int y, m, d;string wk;while(cin days days+;y = getyear(days);m = getmonth(y, days);d = getday(days);cout #include#include#include#includeusing namespace std;#define bigint _int64/这道题目不能用无符号数,不然 wa/欧几里德,求最大公约数bigint gcd(bigint a,bigint b)while (b)bigint c = a % b;a = b;b = c;return
7、a;/a*b%nbigint product_mod(bigint a,bigint b,bigint n)bigint tmp = 0;while (b)if (bif (tmp=n) tmp-=n;a=n) a-=n;b=1;return tmp;/am%nbigint power_mod(bigint a,bigint m,bigint n)bigint tmp = 1;a%=n;while (m)if (ma = product_mod(a,a,n);m=1;return tmp;int pri = 2,3,5,7,11,13,17,19,23,29;/Miller_Rabin 大素数
8、判断bool Miller_Rabin(bigint n)/n,s.取 s 个随机数值 a,进行 a 是 n 为和数的证明判断if (n=1,k+;for (i = 0 ; i =n) return true;a = power_mod(prii,m,n);/幂取模if (a=1) continue;for (j = 0 ; j 1 bigint A = rho(T);bigint B = rho(N / T);return AB?A:B;/扩展欧几里德,求 ax+by=gcd(a,b)中的 x,y,其中 d=gcd(a,b)void Gcd(bigint a,bigint b,bigint
9、return;Gcd(b,a%b,d,y,x);y -= x * (a/b);/求 a 关于 n 的逆bigint inv(bigint a,bigint n)bigint d,x,y;Gcd(a,n,d,x,y);if (d=1) return ( x % n + n ) % n;else return -1;bigint P,Q;/ N = P * Qbigint T;/T = (P - 1) * (Q - 1)bigint C,E,N;int main()freopen(“G:/in“,“r“,stdin);srand(unsigned int)time(NULL);/已知的是密文 ,公
10、钥,N (= P * Q).while (scanf(“%I64d%I64d%I64d“,/找两个大素数,使得 P*Q=N.现在是已知 N,去求这两个大素数Q = N / P;T = (P - 1) * (Q - 1);/其实 T 就是 phiN,N 的欧拉函数,因为 P,Q 都是素数,所以(P-1)*(Q-1)就是他的欧拉函数bigint D = inv(E,T);/求 E 关于 T 的逆元, 因为这里是 gcd(E,T)=1,而又要 E*D%T=1bigint M = power_mod(C,D,N);/M = (CD)%N,如果是求 C,就是 C=(ME)%Nprintf(“%I64dn“,M);