cf144A题解

本题思路:

没有式子,就创造式子!

可以将p分解因数为:

\[x1^{a1} * x2^{a2} * x3^{a3} …… \]

将q分解为:

\[y1^{b1} * y2^{b2} * y3^{b3}…… \]

那么x的因数分解就很明显了,x应该是:

\[i为1-n的任意数 \]

\[x1^{a1} * x2^{a2} * x3^{a3} ……xi^{bi-1}…… \]

中的max

举个栗子

p=30,q=15

\[p=2^1 * 3^1 * 5^1 \]

\[q=3^1 * 5^1 \]

备选的方案有:

\[1. 2^1*5^1 \]

\[2. 2^3*5^1 \]

\[PS:不会有人认为会有2^{-1} * 3^1 * 5*1 的解吧 \]

题解到此结束

调TLE

代码提交上去之后狂T不止,题解甚至只用了2,3ms。

噔噔棱噔噔!

调查:当代码TLE时,你会优先:

(以上是LEWISAK的优先级)

那么各个方法的效果如何呢?

  1. 卡常!
    效果:搬上了祖传的火车头也无济于事
  2. 看题解!
    效果:码风都改的完全一样了还是T
  3. 查看死循环!
    效果:调了1h+
  4. 给自己造各种hack!
    效果:当啥都是hack时,hack将毫无意义:)
  5. 变身草履虫!
    效果绝佳!

猜猜是为啥?

while(y--){
        ...
}

在我的代码中,远远比:

for(int i=1;i<=y;i++){
        ...
}

慢!

ACcode:

#include<bits/stdc++.h>
#define int long long
using namespace std;
int t,q,p;
int get(int x,int y){
	int ttt=0;
	while(!(x%y)){
		ttt++;
		x/=y;
	}
	return ttt;
}
int pw(int x,int y){
	int ttt=1;
	for(int i=1;i<=y;i++){
		ttt*=x;
	}
	return ttt;
}
signed main(){
	cin>>t;
	while(t--){
		int ans=1;
		cin>>q>>p;
		for(int i=2;i<=sqrt(p);i++){
			if(!(p%i)){
				ans=max(ans,(int)(q/pw(i,get(q,i)-get(p,i)+1)));
				while(!(p%i)){
					p/=i;
				}
			}
		}
		if(p>1){
			ans=max(ans,(int)(q/pw(p,get(q,p)-get(p,p)+1)));
		}
		cout<<ans<<endl;
	}
}
posted @ 2024-04-19 23:09  LEWISAK  阅读(13)  评论(0)    收藏  举报