题意:一个有限数数从A进制转换为B进制,如果依然是有限数输出YES,否则NO
算法:
只要检查A中的质因子 是否都在 B中被包含。
刚开始二了,分别把每个数分解质因数,然后二分查找是否存在果断TLE。
分解A的质数prime[i]时,就用B%prime[i]判断是否整除。。。同时进行
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
#include<stdio.h> #include<string.h> #include<iostream> #include<vector> #include<string> #include<math.h> #include<map> #include<set> #include<algorithm> using namespace std; long long prime[1000110]; bool visit[1000110] = {0}; long long ans = 0; long long ha[5660000]; long long hb[5660000]; void Get_Prime( ) { double xx = (double) sqrt(1000100.0); int x = xx; visit[0] = visit[1] = true; ans = 0; for( long long i = 2; i <= x; i++) { if( !visit[i] ) { for( long long j = i + i; j <= 1000100; j += i ) { visit[j] = true; } } } for( long long i = 1; i <= 1000100; i++) { if( !visit[i] ) prime[ans++] = i; } } bool jugde( long long y, long long x) { long long fuck = 0; while( 1 ) { while( x != 1 && x && (x % prime[fuck] == 0 )) { x /= prime[fuck]; if(prime[fuck] != 0 && y % prime[fuck] != 0 ) return false; } fuck++; if( x <= 1 ) break; if( fuck >= ans ) { if( x!= 0 && y % x != 0 ) return false; else return true; } } return true; } int main( ) { long long T, N, M, abc = 1; scanf("%I64d",&T); Get_Prime( ); while(T--) { scanf("%I64d%I64d",&N,&M); printf("Case #%I64d: ",abc++); if( !jugde( M, N) ) puts("NO"); else puts("YES"); } return 0; }