poj 1091 跳蚤

poj 1091 跳蚤,第1张

poj 1091 跳蚤
#include<iostream>#include<algorithm>#include<stdio.h>using namespace std;const int Max = 50;struct data{    int num, v; }fac[Max];bool cmp(data a, data b){    if(a.num < b.num) return true;    else return false;}__int64 mypow(int num, int n){//  求num^n,此时得用到__int64。    __int64 ans = 1;    while(n --) ans *= num;    return ans;}int find_factor(int num){    int i, j, cou = 0;    for(i = 2; i * i < num; i ++)        //  求出num的所有因子(除去1)。        if(num % i == 0){ fac[cou ++].num = i; fac[cou ++].num = num / i;        }    if(i * i == num) fac[cou ++].num = i;//  补sqrt(num)。    fac[cou ++].num = num;    //  补num。    sort(fac, fac + cou, cmp);    for(i = 0; i < cou; i ++){//  求出每个因子的处理值,0为跳过,奇数为-,偶数为+。        bool prime = true;        int k = 0;        for(j = 0; j < i; j ++) if(fac[j].v == 1 && fac[i].num % fac[j].num == 0){     k ++;     prime = false;     if(fac[i].num % (fac[j].num * fac[j].num) == 0){         k = 0;         break;     } }        if(prime) fac[i].v = 1;        else fac[i].v = k;    }    return cou;    // 返回因子的个数。}int main(){    int n, m, cou;    while(scanf("%d %d", &n, &m) != EOF){        cou = find_factor(m);        __int64 sum = mypow(m, n);        for(int i = 0; i < cou; i ++){ if(fac[i].v == 0) continue; else if(fac[i].v % 2 == 1)     sum -= mypow(m / fac[i].num, n); else     sum += mypow(m / fac[i].num, n);        }        printf("%I64dn", sum);    }    return 0;}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4936667.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-13
下一篇 2022-11-13

发表评论

登录后才能评论

评论列表(0条)

保存