每日一道思维题——CF1538D - Another Problem About Dividing Numbers
题意:
给定一个整数t,有t组数据,对于每组数据,有整数a,b,k。求能否通过共k步的整除使a,b变成一样的数
思路:
本题可以转换为求a可以由多少个整数构成(x1个),b由多少个整数构成(x2个),判断x1+x2与k的关系
大于等于时YES,小于时NO
AC代码如下:
#include<iostream> using namespace std; int cou_gcd(int x) { int sum = 0; for(int i = 2; i*i <= x; i++) { while(x%i==0) { sum++; x/=i; } } if(x > 1) sum++; return sum; } int main() { int t; scanf("%d", &t); while(t--) { int a, b, k; scanf("%d%d%d", &a, &b, &k); int x = cou_gcd(a); int y = cou_gcd(b); if(k > 1) { if(x+y >= k) printf("YES\n"); else printf("NO\n"); }else if(k == 1){ if((a%b==0||b%a==0)&&a!=b) printf("YES\n"); else printf("NO\n"); } } return 0; }
附上一张我超时的代码:
#include<iostream> using namespace std; int cou_gcd(int x) { int sum = 0; for(int i = 2; i <= x/i; i++) { while(x%i==0) { sum++; x/=i; } } if(x > 1) sum++; return sum; } int main() { int t; scanf("%d", &t); while(t--) { int a, b, k; scanf("%d%d%d", &a, &b, &k); int x = cou_gcd(a); int y = cou_gcd(b); if(k > 1) { if(x+y >= k) printf("YES\n"); else printf("NO\n"); }else if(k == 1){ if((a%b==0||b%a==0)&&a!=b) printf("YES\n"); else printf("NO\n"); } } return 0; }
二者差距在求质因子个数时for的条件不同,
i <= x/i 会TLE
但是 i*i <= x 可以ac
浙公网安备 33010602011771号