博客
关于我
codeforces1033D 2000分数学
阅读量:294 次
发布时间:2019-03-03

本文共 3431 字,大约阅读时间需要 11 分钟。

为了求解问题,我们首先分析每个数a_i的质因数分解情况,然后将它们相乘得到sum,最后计算sum的约数个数。具体步骤如下:

  • 分析每个a_i的质因数分解

    • 检查a_i是否为某个数的四次方、立方或平方。若不是,则判断其是否是两个不同质数的乘积。
    • 根据判断结果,记录对应的质因数及其指数。
  • 累加质因数指数

    • 对于每个质因数,将其在sum中的总指数累加。
  • 计算约数个数

    • 将sum的质因数分解中的每个指数加1,相乘得到约数个数。
  • 通过上述步骤,可以高效地计算出sum的约数个数,并对结果取模。

    代码实现

    #include 
    using namespace std;const ll mod = 998244353;const int maxn = 1e4 + 5;const double eps = 1e-6;int n;int cnt = 0, cur = 0;ll ans = 1;struct node { ll x, num;} a[MAXN];struct prime { ll x, num;} p[MAXN];ll four(ll x) { ll y = pow(x, 1.0 / 4) + eps; if (y * y * y * y == x) { bool flag = 0; for (int i = 1; i <= cnt; i++) { if (y == p[i].x) { flag = 1; p[i].num += 4; break; } } if (!flag) { p[++cnt].x = y; p[cnt].num = 4; } return 1; } return 0;}ll three(ll x) { ll y = pow(x, 1.0 / 3) + eps; if (y * y * y == x) { bool flag = 0; for (int i = 1; i <= cnt; i++) { if (y == p[i].x) { flag = 1; p[i].num += 3; break; } } if (!flag) { p[++cnt].x = y; p[cnt].num = 3; } return 1; } return 0;}ll two(ll x) { ll y = pow(x, 1.0 / 2) + eps; if (y * y == x) { bool flag = 0; for (int i = 1; i <= cnt; i++) { if (y == p[i].x) { flag = 1; p[i].num += 2; break; } } if (!flag) { p[++cnt].x = y; p[cnt].num = 2; } return 1; } return 0;}void add_a(ll x, ll num) { bool flag = 0; for (int i = 1; i <= cur; i++) { if (x == a[i].x) { flag = 1; a[i].num += num; break; } } if (!flag) { a[++cur].x = x; a[cur].num = num; }}void add_p(ll x, ll num) { bool flag = 0; for (int i = 1; i <= cnt; i++) { if (x == p[i].x) { flag = 1; p[i].num += num; break; } } if (!flag) { p[++cnt].x = x; p[cnt].num += num; }}void try1(int i) { bool flag = 0; for (int j = i + 1; j <= cur; j++) { ll y = __gcd(a[i].x, a[j].x); if (y > 1) { flag = 1; add_p(y, a[i].num); add_p(a[i].x / y, a[i].num); break; } } if (!flag) { ans *= (a[i].num + 1); ans %= mod; ans *= (a[i].num + 1); ans %= mod; }}void solve() { for (int i = 1; i <= cur; i++) { bool flag = 0; for (int j = 1; j <= cnt; j++) { if (a[i].x % p[j].x == 0) { add_p(p[j].x, a[i].num); add_p(a[i].x / p[j].x, a[i].num); flag = 1; break; } } if (!flag) { try1(i); } }}void cal() { for (int i = 1; i <= cnt; i++) { ans *= (p[i].num + 1); ans %= mod; } printf("%lld\n", ans);}int main() { scanf("%d", &n); for (int i = 1; i <= n; i++) { ll x; scanf("%lld", &x); if (four(x) || three(x) || two(x)) { continue; } else { add_a(x, 1); } } solve(); cal(); return 0;}

    代码解释

  • 数据结构:使用nodeprime结构体分别存储数a和质因数p及其出现次数。
  • 四次方、立方、平方检查:通过计算幂次根,判断a_i的结构,记录质因数。
  • 质因数累加:将每个质因数的次数累加到总质因数分解中。
  • 约数个数计算:将每个质因数的次数加1,相乘得到结果,并对结果取模。
  • 通过上述步骤,代码能够高效地解决问题。

    转载地址:http://buml.baihongyu.com/

    你可能感兴趣的文章
    MySQL查询优化之索引
    查看>>
    mysql查询储存过程,函数,触发过程
    查看>>
    mysql查询总成绩的前3名学生信息
    查看>>
    mysql查询慢排查
    查看>>
    MySQL查询报错ERROR:No query specified
    查看>>
    mysql查询数据库储存数据的占用容量大小
    查看>>
    MySQL查询数据库所有表名及其注释
    查看>>
    MySQL查询数据表中数据记录(包括多表查询)
    查看>>
    MySQL查询结果排序
    查看>>
    MYSQL查询语句优化
    查看>>
    mysql查询语句能否让一个字段不显示出来_天天写order by,你知道Mysql底层执行原理吗?
    查看>>
    MySQL查询语句:揭秘专家秘籍,让你秒变数据库达人!
    查看>>
    mysql查询超时对PHP执行的影响
    查看>>
    mysql查询输出到excel文件_如何保存mysql查询输出到excel或.txt文件?
    查看>>
    mysql查询过程
    查看>>
    MySQL模拟Oracle序列sequence
    查看>>
    Mysql模糊查询like效率,以及更高效的写法
    查看>>
    MySQL死锁套路:一次诡异的批量插入死锁问题分析
    查看>>
    Mysql死锁问题Deadlock found when trying to get lock;try restarting transaction
    查看>>
    mysql每个数据库的最大连接数_MySQL数据库最大连接数
    查看>>