POJ 2109 *** Power of Cryptography

题意:对数p开n次方,求所得结果k。

要求:1<=n<= 200, 1<=p<10101,1<=k<=109


想法:一开始我想了想觉得数据好大呀惊恐惊恐惊恐!!!如果10^101开2次方这个好难呀快哭了!!!单纯的我开了一个1000000的数组,打算先把一开始的质数全部找出来。。于是写了如下代码。。。

void getprime() {
	prime[0] = 2, prime[1] = 3, prime[2] = 5;
	ll temp = 7;
	int flag,flagg,i,j,yu;
	for (i = 3; i < 25000; ++temp) {
		flag = 1,flagg=0;
		yu = temp % 10;
		if (yu == 1 || yu == 3 || yu == 7 || yu == 9){
			flagg = 1;
			for (j = 0; prime[j] <= sqrt(temp) && j < i; ++j)
				if (!(temp%prime[j])) { flag = 0; break; }
		}
		if (flag&&flagg) {
			prime[i] = temp;
			++i;
		}
	}
}

嗯。。只能找到25000才符合1000ms的要求嘛。。得意得意

于是我接下来这么做了~

<pre class="html" name="code">int main() {
	getprime();
	ll n, p;
	while (cin >> n >> p) {
		cout << n << " " << p;
		ll res = 1;
		int i = 0;
		while (p != 1) {
			while (!(p%prime[i])) {
				res *= prime[i];
				p = p / (pow(prime[i], n));
			}
			++i;
		}
		cout << res << endl;
	}
	return 0;
}

 

我得意洋洋,开开心心的打算跑数据,此时我内心是这样的~得意hiahiahia 小case!!!

结果。。“7 4357186184021382204544”这组数据。。long long完全没办法hold的好吗!!!快哭了快哭了

我当时觉得自己傻逼了难过难过,这个数据还是10^101!!!高精度吗!!!难道!!!不是说好的贪心吗!!啊!!!!!抓狂抓狂

于是我打算去discuss去找思路啦啦啦啦~~得意

嗯。。。然后。。。

我看到了这个问题的code。。。如下。。。

int main() {
	double n, m;
	while (scanf("%lf%lf", &n, &m) == 2) printf("%.0lf\n", pow(m, 1 / n));
	return 0;
}

微笑这是在逗我吗?

好了。。。认真一点。。

这个代码确实能AC。然而需要进一步了解的就是pow函数是实现的。以及这个题除了这个解法以外,还有没有其他的不那么水的code。

这里留个思路,因为p肯定可以开n次方,故可以从对k的猜测入手,对k从高位一直猜测到低位。

比如对于四位的k,猜测k的最高位为x1,于是比较(x1*1000)^n、((x1+1)*1000)^n与p的关系,从而确定x1。思路大概这样,但是这样还是会用到pow。。但是也可以不用pow自己写个pow。。。但是这也没有什么用。。。

今天就到这里,下次见。再见再见再见


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值