• 【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
    %d
    %d
    " , ans1 , ans2 , (m - ans1 - ans2 - 1 + 2 * mod) % mod);
        return 0;
    }
    

     

  • 相关阅读:
    OpenStack 发行版本
    刷新linux硬盘存储接口
    LVM实践
    LVM man帮助
    ansible --help 文档
    nmcli connection modify eth1 ipv4.addr "192.168.31.23" ipv4.method manual
    自己动手使用, MetaWeblog 发布博客(cnblogs)
    测试图片上传 on Markdown editor
    大批量更新数据mysql批量更新的四种方法
    PHP print_r 转换/还原为数组
  • 原文地址:https://www.cnblogs.com/GXZlegend/p/6999664.html
Copyright © 2020-2023  润新知