Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

从wa到Tle快疯了,占代码求助,囧rz

Posted by fanliqian at 2009-04-27 11:06:49 on Problem 1811
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
long long fac[100];
long long mod(long long a, long long b, long long n)
{
	long long t = 1, y = a;
	while(b) {
		if(b&1) t = (t * y) % n;
		y = (y*y) % n;
		b >>= 1;
	}
	return t;
}

long long F(long long x, long long n)
{
	long long t = x, tmp = x, ans = 0;
	while(t) {
		if(t & 1)
			ans = (ans + tmp) % n;
		tmp <<= 1; tmp %= n;
		t >>= 1;
	}
	return ans;
}

bool miller(long long n, long long b)
{
	long long l, m, i, x0, x1;
	m = n-1;
	l = 0;
	while(m % 2 == 0) {
		l++; m >>= 1;
	}
	x0 = mod(b, m, n);
	for(i = 0; i < l; i++) {
		x1 = F(x0, n);
		if ( x1 == 1 && x0 != 1 && x0 != n - 1 ) return 0;
		x0 = x1;
	}
	if(x1 != 1) return 0;
	return 1;
}
bool check(long long n)
{
	srand(time(0));
	if (n==1||(n!=2&&!(n%2))||(n!=3&&!(n%3))||(n!=5&&!(n%5))||(n!=7&&!(n%7))) return 0;
	if(n == 2) return 1;
	int time = 32;
	long long b;
	while(time--) {
		b = rand()%(n-1) + 1;
		if(!miller(n, b)) return 0;
	}
	return 1;
}

long long gcd(long long a, long long b)
{
	if(a < 0) a = -a;
	long long  r = a % b;
	while(r) {
		a = b; b = r;
		r = a % b;
	}
	return b;
}

long long pollard_brent(long long n)
{
	srand(time(0));
	long long x = 0, y, k = 2, i = 1, d = 1, a;
	a = 1;
	x = rand()%(n-1) + 1;
	y = x;
	while(true) {
		i++;
		x = (F(x, n) + n -1) % n;
		d = gcd(y-x, n);
		if(1 < d && d < n) return d;
		if(d == n || y == x) return n;
		if(k == i) {
			y = x;
			k <<= 1;
		}
	}
}
void find(long long n)
{
	if(check(n)) {
		fac[0]++;
		fac[fac[0]] = n;
		return ;
	}
	long long p = n;
	while(p == n)
		p = pollard_brent(p);
	find(p);
	find(n/p);
}

int main()
{
	long long n, t, i, tmp;

	scanf("%lld", &t);
	while(t--) {
		scanf("%lld", &n);
		if(check(n)) printf("Prime\n");
		else {
			if(!(n & 1) ) { printf("2\n"); continue;}
			fac[0] = 0;
			find(n);
			for(tmp = n, i = 1; i <= fac[0]; i++)
				if(fac[i] < tmp) tmp = fac[i];
			printf("%lld\n", tmp);
		}
	}
	return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator