【bzoj1408】[Noi2002]Robot 数论+dp

题目描述

输入

输出

样例输入

3
2 1
3 2
5 1

样例输出

8
6
75


题解

语文题+数论+dp

花了大段讲述什么叫mu,什么叫phi,只是新定义的mu将2看作有平方因子,新定义的phi(1)=0。

要求的就是mu值为1的数的phi值之和、所有mu值为-1的phi值之和、以及所有mu值为0的phi值之和。

先只考虑前两种,此时无论质因子有多少个,能够使用的只有1个。如果p不是2,那么就有两种情况:使用和不使用。使用的话,素数个数+1,也就是mu变为相反数。

又因为phi是积性函数,所以之前的phi的和乘上p-1就是新得到的phi值和。

用一个类似于dp的思想求出这两个答案,最后由于∑phi(d)(d|m)=m,那么三种答案之和应该为m-1(因为题目中说1不算做约数),所以m-1减去前两种即可得到第三种。

处理ans1和ans2的时候应该先把phi1当作1处理,然后再减掉。

#include <cstdio>
#include <algorithm>
#define mod 10000
using namespace std;
int pow(int x , int y)
{
    int ans = 1;
    while(y)
    {
        if(y & 1) ans = ans * x % mod;
        x = x * x % mod , y >>= 1;
    }
    return ans;
}
int main()
{
    int k , m = 1 , i , p , e , ans1 = 1 , ans2 = 0 , t;
    scanf("%d" , &k);
    while(k -- )
    {
        scanf("%d%d" , &p , &e) , m = m * pow(p , e) % mod;
        if(p != 2) t = ans1 , ans1 = (ans1 + ans2 * (p - 1)) % mod , ans2 = (ans2 + t * (p - 1)) % mod;
    }
    ans1 = (ans1 - 1 + mod) % mod;
    printf("%d\n%d\n%d\n" , ans1 , ans2 , (m - ans1 - ans2 - 1 + 2 * mod) % mod);
    return 0;
}

 

 

posted @ 2017-06-13 10:06  GXZlegend  阅读(418)  评论(0编辑  收藏  举报