[数论]Codeforces 757E. Bash Plays with Functions

Description

f0(n)fr+1==uv=n[(u,v)=1]1fr
fr(n)

Solution

因为 n 的所有质因子之间对f0(n)贡献是独立的,所以 f0 是个积性函数。
那么就有所有 fr 都是积性函数。
将每个质因子单独考虑,狄利克雷卷积的形式就可以化成简单的求和(可能就是普通的卷积???)

fr+1(pa)=i=0afr(pi)
发现 f0(pa)=[a0]+1
直接DP就好啦。

#include <bits/stdc++.h>
using namespace std;

const int N = 1010101;
const int MOD = 1000000007;
typedef long long ll;

inline char get(void) {
    static char buf[100000], *S = buf, *T = buf;
    if (S == T) {
        T = (S = buf) + fread(buf, 1, 100000, stdin);
        if (S == T) return EOF;
    }
    return *S++;
}
template<typename T>
inline void read(T &x) {
    static char c; x = 0;
    for (c = get(); c < '0' || c > '9'; c = get());
    for (; c >= '0' && c <= '9'; c = get()) x = x * 10 + c - '0';
}

int n, r, q, x, sum, Pcnt, ans, lim;
vector<int> fact[N];
int f[N][30];
int prime[N], vis[N];

inline void Add(int &x, int a) {
    x += a; while (x >= MOD) x -= MOD;
}

int main(void) {
    freopen("1.in", "r", stdin);
    read(q); f[0][0] = 1; lim = 1000000;
    for (int i = 1; i <= 20; i++) f[0][i] = 2;
    for (int i = 1; i <= lim; i++) {
        sum = 0;
        for (int j = 0; j <= 20; j++) {
            Add(sum, f[i - 1][j]);
            Add(f[i][j], sum);
        }
    }
    for (int i = 2; i <= lim; i++) {
        if (!vis[i]) prime[++Pcnt] = i;
        for (int j = 1; j <= Pcnt && (x = prime[j] * i) <= lim; j++) {
            vis[x] = 1; if (!(i % prime[j])) break;
        }
    }
    for (int i = 1; i <= Pcnt; i++)
        for (int j = prime[i]; j <= lim; j += prime[i])
            fact[j].push_back(prime[i]);
    while (q--) {
        read(n); read(r); ans = 1;
        for (int d: fact[r]) {
            x = 0;
            while (!(r % d)) {
                r /= d; ++x;
            }
            ans = (ll)ans * f[n][x] % MOD;
        }
        printf("%d\n", ans);
    }
    return 0;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值