Codeforces 757E 积性函数

来源:互联网 发布:豆沙色唇膏 知乎 编辑:程序博客网 时间:2024/05/17 07:58

1.首先 百度学习积性函数定义 或者 wiki学multiplicative function
2.fr+1(n)=d|nfr(d) 这个还是很好发现的
3.假设n=pe11pe22
4.因为f0 是积性函数,所以f0(n)=f0(pe11)f0(pe22)
5.

f1(n)=d|nf0(d)=i=0e1j=0e2f0(pi1pj2)=i=0e1f0(pi1)j=0e2f0(pj2)=f1(pe11)f1(pe22)

所以f1是积性函数
同理fr+1也是积性函数
6.故要求的就是fr+1(pe)=fr+1(pe1)+fr(pe)而且这个值和p是多少是没有关系的,开个dp推一下就行了

#include <iostream>#include <cstring>#include <cstdio>#include <vector>#include <set>#include <map>#include <queue>#include <algorithm>#include <stack>#include <cctype>#include <cmath>#include <vector>#include <sstream>#include <bitset>#include <deque>#include <iomanip>using namespace std;#define pr(x) cout << #x << " = " << x << endl;#define bug cout << "bugbug" << endl;#define ppr(x, y) printf("(%d, %d)\n", x, y);#define MST(a,b) memset(a,b,sizeof(a))#define CLR(a) MST(a,0)#define SQR(a) ((a)*(a))#define PCUT puts("\n---------------")typedef long long ll;typedef double DBL;typedef pair<int, int> P;typedef unsigned int uint;const int MOD = 1e9 + 7;const int inf = 0x3f3f3f3f;const ll INF = 0x3f3f3f3f3f3f3f3f;const int maxn = 1e6 + 4;const int maxm = 2e1 + 4;const double pi = acos(-1.0);ll dp[maxn][maxm];vector<int> fac[maxn];void divide(int num){    int t = num;    for (int i = 2; i * i <= num; ++i)        if (num % i == 0){            int tmp = 0;            while(num % i == 0) tmp++, num /= i;            fac[t].push_back(tmp);         }    if (num != 1){        fac[t].push_back(1);    }    return;} void init(){    for (int i = 0; i < maxm; ++i) dp[0][i] = 1 << i;    for (int i = 0; i < maxm; ++i) dp[1][i] = 1 + 2 * i;     for (int i = 2; i < maxn; ++i){        dp[i][0] = 1;        for (int j = 1; j < maxm; ++j) dp[i][j] = (dp[i][j-1] + dp[i-1][j]) % MOD;    }    return;}ll fun(int r, int num){    if (r == 0) return dp[0][fac[num].size()];    ll sum = 1;    for (int i = 0; i < fac[num].size(); ++i){        sum = sum * dp[r][fac[num][i]] % MOD; //      cout << fac[num][i] << ' ';     }     return sum;}int main(){//必须编译过才能交    int ik, i, j, k, kase;    init();    for (int i = 1; i < maxn; ++i) divide(i);    int q;    scanf("%d", &q);    while(q--){        int r, num;        scanf("%d%d", &r, &num);        printf("%I64d\n", fun(r, num));    }    return 0;}
0 0