zoukankan      html  css  js  c++  java
  • JZYZOJ1378 [noi2002]M号机器人 欧拉函数


    http://172.20.6.3/Problem_Show.asp?id=1378
    日常懒得看题目怪不得语文差,要好好读题目了,欧拉函数大概是数论里最友好的了,不用解方程不用转换过来转换过去只需要简单乘在一起就可以了。
    比较有趣的是求和的部分,因为类似于等比数列的性质,求全部的因数独立值的和竟然只需要快速幂然后最后去掉一个没有用的1(因为这个1是从头到尾没有乘上一个因数的)(具体见代码),非常神奇

    代码

     1 #include<iostream>  
     2 #include<cstdio>  
     3 #include<cstring>  
     4 #include<algorithm>  
     5 #include<cmath>
     6 using namespace std;
     7 const int maxn=1010;
     8 const int modn=10000;
     9 long long k;
    10 long long a[maxn]={},b[maxn]={};
    11 long long f[maxn][2]={};
    12 long long pow(long long x,long long y){
    13     long long z=1;
    14     while(y){
    15         if(y&1){z*=x;z%=modn;}
    16         y/=2;x*=x;x%=modn;
    17     }
    18     return z;
    19 }
    20 int main(){
    21     scanf("%I64d",&k);
    22     int f1=0;
    23     for(int i=1;i<=k;i++){
    24         scanf("%I64d%I64d",&a[i],&b[i]);
    25     }
    26     f[0][0]=1;int nex=0;
    27     for(int i=1;i<=k;i++){
    28         if(a[i]==2)continue;
    29         f[i][0]=f[nex][1]*(a[i]-1)+f[nex][0];f[i][0]%=modn;
    30         f[i][1]=f[nex][0]*(a[i]-1)+f[nex][1];f[i][1]%=modn;
    31         nex=i;
    32     }long long cnt=1;f[k][0]-=1;
    33     for(int i=1;i<=k;i++){
    34         cnt*=pow(a[i],b[i]);cnt%=modn;
    35     }cnt-=1;
    36     cnt=(cnt-f[k][0]-f[k][1]+2*modn)%modn;
    37     printf("%I64d
    %I64d
    %I64d
    ",f[k][0],f[k][1],cnt);
    38     return 0;
    39 }
    View Code
  • 相关阅读:
    redis的事务不是原子性
    Jenkins持续集成 入门实践
    Docker入门实践
    程序员该有的职业素养
    ubuntu sudoers配置错误
    日志分析工具 Log Parser
    压力测试记录
    Winscp使用sudo user登录
    Linux下通过NFS共享文件夹
    Jexus 5.4.6 on CentOS 6.6
  • 原文地址:https://www.cnblogs.com/137shoebills/p/7788117.html
Copyright © 2011-2022 走看看