• poj 2649 Factovisors


      继续做一下分解质因数的水题!

    View Code
      1 #include <cstdio>
      2 #include <cstring>
      3 #include <cstdlib>
      4 #include <cmath>
      5 #include <algorithm>
      6 #include <iostream>
      7 
      8 #define debug 0
      9 
     10 using namespace std;
     11 
     12 typedef __int64 ll;
     13 const int maxn = 100005;
     14 
     15 bool np[maxn];
     16 int pn, pr[maxn >> 2];
     17 
     18 void gp(){
     19     memset(np, 0, sizeof(np));
     20     np[0] = np[1] = true;
     21     pn = 0;
     22     for (int i = 2; i < maxn; i++){
     23         if (!np[i]) pr[pn++] = i;
     24         for (int j = 0; j < pn && pr[j] * i < maxn; j++){
     25             np[pr[j] * i] = true;
     26             if (i % pr[j] == 0) break;
     27         }
     28     }
     29     #if debug
     30     printf("pn %d\n", pn);
     31     #endif
     32 }
     33 
     34 void fac(int a, int *f, int *n, int &cnt){
     35     int i = 0;
     36 
     37     cnt = 0;
     38     if (!a) return ;
     39     while (pr[i] * pr[i] <= a && i < pn){
     40         if (a % pr[i] == 0){
     41             f[cnt] = pr[i];
     42             n[cnt] = 0;
     43             while (a % pr[i] == 0) a /= pr[i], n[cnt]++;
     44             cnt++;
     45         }
     46         i++;
     47     }
     48     if (a != 1) f[cnt] = a, n[cnt++] = 1;
     49 }
     50 
     51 int cnt_fac(int n, int f){
     52     int ep = f;
     53     int ret = 0;
     54 
     55     while (ep <= n){
     56         ret += n / ep;
     57         ep *= f;
     58     }
     59 
     60     return ret;
     61 }
     62 
     63 bool deal(int a, int b){
     64     int f[30], cf[30];
     65     int n = 0;
     66 
     67     memset(f, 0, sizeof(f));
     68     fac(a, f, cf, n);
     69     #if debug
     70     printf("n  %d\n\n", n);
     71     for (int i = 0; i < n; i++) {
     72         printf("%d  %d\n", f[i], cf[i]);
     73     }
     74     f[n] = 0;
     75     #endif
     76 
     77     for (int i = 0; i < n; i++) {
     78         #if debug
     79         printf("fac %d  num %d\n", f[i], cnt_fac(b, f[i]));
     80         #endif
     81         if (cf[i] > cnt_fac(b, f[i])) {
     82             return false;
     83         }
     84     }
     85     return true;
     86 }
     87 
     88 int main(){
     89     int a, b;
     90 
     91     gp();
     92     while (~scanf("%d%d", &a, &b)){
     93         if (deal(b, a) && b) {
     94             printf("%d divides %d!\n", b, a);
     95         }
     96         else {
     97             printf("%d does not divide %d!\n", b, a);
     98         }
     99     }
    100 
    101     return 0;
    102 }

     

    ——written by Lyon

  • 相关阅读:

    JVM基础
    rpm、yum、解压缩安装
    Vim使用及账号用户管理
    linux常用操作
    属主权限和属组权限
    解决Hystrix Dashboard 一直是Loading ...的情况
    扫描不到了@FeignClient注解的调用接口
    springcloud与springboot版本问题
    【力扣】6和9组成的最大数字 题解
  • 原文地址:https://www.cnblogs.com/LyonLys/p/poj_2649_Lyon.html
Copyright © 2020-2023  润新知