【提取素因子+积性函数】小明的密钥_C/C++_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > C/C++ > 【提取素因子+积性函数】小明的密钥

【提取素因子+积性函数】小明的密钥

 2011/8/29 9:58:07  基德KID.1412  http://972169909-qq-com.iteye.com  我要评论(0)
  • 摘要:http://acm.nyist.net/JudgeOnline/problem.php?pid=362#include<iostream>#include<fstream>#include<algorithm>#include<string>#include<set>#include<map>#include<queue>#include<utility>#include<stack>
  • 标签:函数

?


?http://acm.nyist.net/JudgeOnline/problem.php?pid=362

?

?



?

?

#include <iostream>
#include <fstream>
#include <algorithm>
#include <string>
#include <set>
#include <map>
#include <queue>
#include <utility>
#include <stack>
#include <list>
#include <vector>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
//#include <ctime>
#include <ctype.h>
using namespace std;
#define LL long long
#define inf 0x3fffffff
#define M  1005

LL prime[170];
bool mark[M];

LL f (LL n)    //自然数立方和公式,边乘边模
{
	return (n * (n+1) / 2) % 10007 * (n * (n+1) / 2) % 10007;
}

int main()
{
	LL i, j, k = 0, a, b, tp, cc = 1, ans;
	for (i = 2; i < M; i++)		//打1005以内素数就够了
	{
		if (!mark[i])
		{
			prime[k++] = i;
			for (j = i << 1; j < M; j += i)
				if (!mark[j])
					mark[j] = true;
		}
	}
	while (~scanf ("%lld%lld", &a, &b))
	{
		ans = 1;
		for (i = 0; i < k; i++)
		{
			if (sqrt(1.0*a) < prime[i])
				break;
			if (a % prime[i] == 0)
			{
				tp = 0;						//tp相当于x2
				while (a % prime[i] == 0)
					a /= prime[i], tp++;
				tp = tp * b + 1;			//相当于x2*b+1
				ans = ans * f(tp) % 10007;	//边模边乘
			}
			if (a == 1)
				break;
		}
		if (a > 1)		//注意可能存在>sqrt(a)的素因子
		{
			tp = b + 1;
			ans = ans * f(tp) % 10007;
		}
		printf ("Case %lld: %lld\n", cc++, ans);
	}
    return 0;
}

??

  • 大小: 54.3 KB
  • 查看图片附件
发表评论
用户名: 匿名