• [UVA10139]Factovisors(数论,质因数)


    题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1080

    题意:问n!能否被m整除。

    给m分解质因数,用这些质因数以及他们的幂分别去除n,直到质因数的幂大于n。统计每一次的商,假如存在一个商小于质因数在m中出现的次数,说明n!不能被m整除了。uDEBUG好好用,没开LL一直wa,结果去查一下就查出来了。

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 typedef long long LL;
     5 LL n, m;
     6 vector<LL> p, a;
     7 
     8 void f(LL x) {
     9   p.clear(); a.clear();
    10   LL xx = (LL)sqrt(x) + 1;
    11   for(LL i = 2; i < xx; i++) {
    12     if(x % i == 0) {
    13       p.push_back(i);
    14       LL cnt = 0;
    15       while(x % i == 0) {
    16         x /= i;
    17         cnt++;
    18       }
    19       a.push_back(cnt);
    20     }
    21   }
    22   if(x > 1) {
    23     p.push_back(x); a.push_back(1);
    24   }
    25 }
    26 
    27 LL mul(LL x, LL n) {
    28   LL ret = 1;
    29   while(n) {
    30     if(n & 1) ret *= x;
    31     n >>= 1; x *= x;
    32   }
    33   return ret;
    34 }
    35 
    36 int main() {
    37   //freopen("in", "r", stdin);
    38   //freopen("out", "w", stdout);
    39   while(~scanf("%lld%lld",&n,&m)) {
    40     if(m == 0) {
    41       printf("%lld does not divide %lld!
    ", m, n);
    42       continue;
    43     }
    44     f(m); bool flag = 0;
    45     for(LL i = 0; i < p.size(); i++) {
    46       LL cnt = 0;
    47       LL j = 1;
    48       LL q = mul(p[i], j++);
    49       while(n >= q) {
    50         cnt += (n / q);
    51         q = mul(p[i], j++);
    52       }
    53       if(cnt < a[i]) flag = 1;
    54       if(flag) break;
    55     }
    56     if(!flag) printf("%lld divides %lld!
    ", m, n);
    57     else printf("%lld does not divide %lld!
    ", m, n);
    58   }
    59   return 0;
    60 }
  • 相关阅读:
    事务
    MySQL删除表的方式
    建立索引的原则
    对表设置引擎
    运算符
    数据库锁简介
    为什么对表设置主键
    php苹果原生apns推送接口
    华为推送
    php操作redis
  • 原文地址:https://www.cnblogs.com/kirai/p/5932564.html
Copyright © 2020-2023  润新知