Miller&&Pollard HDOJ 4344 Mark the Rope

题目传送门

题意:一个长为n(n<2^63)的管子,在管子上做标记,每隔L个长度单位做一个标记,从管子头端开始,保证最后一次标记恰好在管子的尾端。让你找出有多少个这样的L(L<n),且他们之间两两互素,然后求出这些L的和最大值。

分析:转换一下就是求n有多少个质因子用pollard_rho大整数分解分解n,因为素数之间两两互质,所以每段L都由每个质因子的k次幂组成,如果n是素数,由于L<n,所以只能L==1

收获:接触到随机算法

代码:

/************************************************
* Author        :Running_Time
* Created Time  :2015-8-28 14:38:38
* File Name     :E.cpp
 ************************************************/

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <cstring>
#include <cmath>
#include <string>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <bitset>
#include <cstdlib>
#include <ctime>
using namespace std;

#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
typedef long long ll;
const int N = 1e5 + 10;
const int S = 20;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;

ll GCD(ll a, ll b)	{
	if (a == 0)	return 1;
	if (a < 0)	a = -a;
	while (b)	{
		ll c = a % b;
		a = b; b = c;
	}
	return a;
}

ll multi_mod(ll a, ll b, ll p)	{
	ll ret = 0;
	a %= p;	b %= p;
	while (b)	{
		if (b & 1)	{
			ret += a;
			if (ret >= p)	ret -= p;
		}
		a <<= 1;
		if (a >= p)	a -= p;
		b >>= 1;
	}
	return ret;
}

ll pow_mod(ll a, ll x, ll p)	{
	ll ret = 1;
	a %= p;
	while (x)	{
		if (x & 1)	ret = multi_mod (ret, a, p);
		a = multi_mod (a, a, p);
		x >>= 1;
	}
	return ret;
}

bool check(ll a, ll n, ll x, int t)	{
	ll ret = pow_mod (a, x, n);
	ll last = ret;
	for (int i=1; i<=t; ++i)	{
		ret = multi_mod (ret, ret, n);
		if (ret == 1 && last != 1 && last != n - 1)	return true;	//合数
		last = ret;
	}
	if (ret != 1)	return true;
	return false;
}

bool Miller_Rabin(ll n)	{
	if (n == 2)	return true;
	if (n < 2 || ! (n & 1))	return false;			//偶数或1
	ll x = n - 1;	int t = 0;
	while (! (x & 1))	{
		x >>= 1;	t++;
	}
	for (int i=1; i<=S; ++i)	{
		ll a = rand () % (n - 1) + 1;
		if (check (a, n, x, t))	return false;		//合数
	}
	return true;
}

ll Pollard_rho(ll x, ll c)	{
	ll i = 1, k = 2;
	ll a = rand () % x;
	ll b = a;
	while (1)	{
		i++;
		a = (multi_mod (a, a, x) + c) % x;
		ll d = GCD (b - a, x);
		if (d != 1 && d != x)	return d;
		if (b == a)	return x;
		if (i == k)	b = a, k += k;
	}
}

void factorize(ll n, vector<ll> &ret)	{
	if (Miller_Rabin (n))	{
		ret.push_back (n);	return ;
	}
	ll p = n;
	while (p >= n)	p = Pollard_rho (p, rand () % (n - 1) + 1);
	factorize (p, ret);
	factorize (n / p, ret);
}

int main(void)    {
	srand (time (NULL));
	int T;	scanf ("%d", &T);
	while (T--)	{
		ll n;	scanf ("%I64d", &n);
		vector<ll> ret;
		factorize (n, ret);
		sort (ret.begin (), ret.end ());
		ll sum = 0, cnt = 0;
		for (int i=0; i<ret.size (); ++i)	{
			ll tmp = ret[i];
			while (i + 1 < ret.size () && ret[i] == ret[i+1])	tmp *= ret[i++];
			sum += tmp;	cnt++;
		}

		if (cnt == 1)	sum /= ret[0];
		printf ("%I64d %I64d\n", cnt, sum);
	}

    return 0;
}

  

时间: 2024-11-10 19:43:49

Miller&&Pollard HDOJ 4344 Mark the Rope的相关文章

[HDU 4344]Mark the Rope(Pollard_rho+Miller_Rabin)

Description Eric has a long rope whose length is N, now he wants to mark on the rope with different colors. The way he marks the rope is:1. He will choose a color that hasn’t been used2. He will choose a length L (N>L>1) and he defines the mark’s va

Miller&amp;&amp;Pollard POJ 1811 Prime Test

题目传送门 题意:素性测试和大整数分解, N (2 <= N < 254). 分析:没啥好讲的,套个模板,POJ上C++提交 收获:写完这题得到模板 代码: /************************************************ * Author :Running_Time * Created Time :2015-8-28 13:02:38 * File Name :POJ_1811.cpp ************************************

51_1037最长循环节 (miller rabin算法 pollard rho算法 原根)

1037 最长的循环节 V2 基准时间限制:1 秒 空间限制:131072 KB 分值: 320 难度:7级算法题 收藏 关注 正整数k的倒数1/k,写为10进制的小数如果为无限循环小数,则存在一个循环节,求<=n的数中,倒数循环节长度最长的那个数. 1/6= 0.1(6) 循环节长度为1 1/7= 0.(142857) 循环节长度为6 1/9= 0.(1)  循环节长度为1 Input 输入n(10 <= n <= 10^18) Output 输出<=n的数中倒数循环节长度最长的

HDU 3864 D_num Miller Rabin 质数判断+Pollard Rho大整数分解

链接:http://acm.hdu.edu.cn/showproblem.php?pid=3864 题意:给出一个数N(1<=N<10^18),如果N只有四个约数,就输出除1外的三个约数. 思路:大数的质因数分解只能用随机算法Miller Rabin和Pollard_rho,在测试多的情况下正确率是由保证的. 代码: #include <iostream> #include <cstdio> #include <cstring> #include <c

Pollard rho算法+Miller Rabin算法 BZOJ 3668 Rabin-Miller算法

BZOJ 3667: Rabin-Miller算法 Time Limit: 60 Sec  Memory Limit: 512 MBSubmit: 1044  Solved: 322[Submit][Status][Discuss] Description Input 第一行:CAS,代表数据组数(不大于350),以下CAS行,每行一个数字,保证在64位长整形范围内,并且没有负数.你需要对于每个数字:第一,检验是否是质数,是质数就输出Prime 第二,如果不是质数,输出它最大的质因子是哪个. O

[科技]$Miller\_Rabin$ 和 $Pollard\_Rho$ 及各种玄学优化

[科技]\(Miller\_Rabin\) 和 \(Pollard\_Rho\) 及各种玄学优化 [科技] \(Miller\_Rabin\) 和 \(Pollard\_Rho\) 先讲\(Miller\_Rabin\)吧,\(Miller\_Rabin\)是用来检验素数的高效算法. 我们先要知道两个定理: 费马小定理:当\(p\)为质数时,\(x^{p - 1} \equiv 1 \ \ (mod \ \ p)\).但这只是一个充分条件,但不是必要条件.即就算\(x\)和\(p\)互质,那么\

【HDOJ 4768】 Flyer (等差数列+二分)

[HDOJ 4768] Flyer (等差数列+二分) Flyer Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2022    Accepted Submission(s): 743 Problem Description The new semester begins! Different kinds of student soc

HDOJ 5352 MZL&#39;s City 匈牙利匹配

求年份和城市的匹配 MZL's City Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 539    Accepted Submission(s): 180 Problem Description MZL is an active girl who has her own country. Her big country has N

hdoj 1824 Let&#39;s go home(2-SAT)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1824 思路分析:该问题为2-SAT问题:需要注意逻辑推理的等价性: (1)题目第一个条件:每一个队或者队长留下或者其与两名队员同时留下,或者表明只能为两种情况中的一种:假设三人为A,B,C,队长为A,0表示不留下,1表示留下,因为B与C同时留下或者不留下,只要B,C中其中一个没有留下或者留下,则B,C中另一个也同样留下或者不留下,所以可以从该条件中推导出六条等价关系,即A不留下->B,C同时留下,A