首页 > 代码库 > [UVA10139]Factovisors(数论,质因数)
[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!\n", 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!\n", m, n);57 else printf("%lld does not divide %lld!\n", m, n);58 }59 return 0;60 }
[UVA10139]Factovisors(数论,质因数)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。