XMU 1615 刘备闯三国之三顾茅庐(三) 【欧拉函数+快速幂+欧拉定理】

1615: 刘备闯三国之三顾茅庐(三)

Time Limit: 1000 MS  Memory Limit: 128 MB
Submit: 45  Solved: 8
[Submit][Status][Web Board]

Description

刘备(161年-223年6月10日),字玄德,东汉末年幽州涿郡涿县,西汉中山靖王刘胜的后代。刘备一生极具传奇色彩,早年颠沛流离、备尝艰辛最终却凭借自己的谋略终成一方霸主。那么在那个风云激荡的年代,刘备又是如何从一个卖草鞋的小人物一步一步成为蜀汉的开国皇帝呢?让我们一起拨开历史的迷雾,还原一个真实的刘备。

公元207年冬至,当时驻军新野的刘备在徐庶的建议下,到南阳卧龙岗拜访诸葛亮。这是刘备第三次拜访诸葛亮的故事。据三国演义记载,此次刘备终于拜访到了诸葛亮,诸葛亮献上草庐对策,为诸葛亮描述了一个良好的战略远景。然而据我翻阅古籍发现:诸葛亮本人其实精通数论,他终于发现前面的题目太简单了,于是给刘备甩下了这么一道题,这是他最新的研究成果:

题目意思很简单:

已知:f(1)=1; f(k)=k^f(k-1),求f(n)%m。

刘备为人深谋远虑,但对此类问题只能急得干瞪眼,请出诸葛亮事关大业,所以聪明的你自告奋勇,抄起纸笔开始计算了。

Input

有多组数据,需处理到文件结束(EOF):

每组数据包含两个整数n,m(1<=n,m<=10^9)

Output

对于每一组数据:

输出一个整数,f(n)%m的值

Sample Input

2 42
5 123456789
94 265

Sample Output

2
16317634
39

HINT

Source

by cjf

[Submit][Status][Web Board]

题目链接:

  http://acm.xmu.edu.cn/JudgeOnline/problem.php?id=1615

题目大意:

  f(1)=1; f(k)=k^f(k-1),求f(n)%m。

题目思路:

  【欧拉函数+快速幂+欧拉定理】

  定理:a^b mod c = a^(b%phi[c]+phi[c]) mod c,其中要满足b >= phi[c]。(phi为欧拉函数)

  由题目可以知道这题f(n)=n^(n-1)^(n-2)^...^2^1。由于是指数级的,f(5)就已经超出longlong范围。所以试用上面的定理优化。

  由于指数只有在4^3^2^1或更小的情况下才有可能<phi[c],所以特殊处理这四个值,其余可以递归求解。

  需要log求解欧拉函数,log求快速幂,递归调用求解函数直至取模的数=1或指数下降到可以直接求的范围。

 1 /****************************************************
 2
 3     Author : Coolxxx
 4     Copyright 2017 by Coolxxx. All rights reserved.
 5     BLOG : http://blog.csdn.net/u010568270
 6
 7 ****************************************************/
 8 #include<bits/stdc++.h>
 9 #pragma comment(linker,"/STACK:1024000000,1024000000")
10 #define abs(a) ((a)>0?(a):(-(a)))
11 #define lowbit(a) (a&(-a))
12 #define sqr(a) ((a)*(a))
13 #define mem(a,b) memset(a,b,sizeof(a))
14 const double EPS=1e-8;
15 const int J=10;
16 const int MOD=100000007;
17 const int MAX=0x7f7f7f7f;
18 const double PI=3.14159265358979323;
19 const int N=1004;
20 const int M=1004;
21 using namespace std;
22 typedef long long LL;
23 double anss;
24 LL aans;
25 int cas,cass;
26 LL n,m,lll,ans;
27 LL euler(LL x)
28 {
29     LL res=x;
30     int i;
31     for(i=2;1LL*i*i<=x;i++)
32     {
33         if(x%i==0)
34         {
35             res=res/i*(i-1);
36             while(x%i==0)x/=i;
37         }
38     }
39     if(x>1)res=res/x*(x-1);
40     return res;
41 }
42 LL mi(LL x,LL y,LL mod)
43 {
44     LL s=1;
45     while(y)
46     {
47         if(y&1)s=(s*x)%mod;
48         y/=2;
49         x=(x*x)%mod;
50     }
51     return s;
52 }
53 LL cal(LL a,LL c)
54 {
55     LL e=euler(c);
56     if(a==3 && e>9)return 9%c;
57     if(a==2 && e>2)return 2%c;
58     if(a==1)return 1;
59     if(c==1)return 0;
60     LL b=cal(a-1,e);
61     return (1LL*mi(a,b,c)*mi(a,e,c))%c;
62 }
63 int main()
64 {
65     #ifndef ONLINE_JUDGE
66     freopen("1.txt","r",stdin);
67 //  freopen("2.txt","w",stdout);
68     #endif
69     int i,j,k;
70     int x,y,z;
71 //  for(scanf("%d",&cass);cass;cass--)
72 //  for(scanf("%d",&cas),cass=1;cass<=cas;cass++)
73 //  while(~scanf("%s",s))
74     while(~scanf("%lld",&n))
75     {
76         scanf("%lld",&m);
77         printf("%lld\n",cal(n,m));
78     }
79     return 0;
80 }
81 /*
82 //
83
84 //
85 */

时间: 2024-11-05 18:49:23

XMU 1615 刘备闯三国之三顾茅庐(三) 【欧拉函数+快速幂+欧拉定理】的相关文章

XMU 1617 刘备闯三国之汉中之战 【BFS+染色】

1617: 刘备闯三国之汉中之战 Time Limit: 1000 MS  Memory Limit: 128 MBSubmit: 6  Solved: 5[Submit][Status][Web Board] Description 刘备(161年-223年6月10日),字玄德,东汉末年幽州涿郡涿县,西汉中山靖王刘胜的后代.刘备一生极具传奇色彩,早年颠沛流离.备尝艰辛最终却凭借自己的谋略终成一方霸主.那么在那个风云激荡的年代,刘备又是如何从一个卖草鞋的小人物一步一步成为蜀汉的开国皇帝呢?让我们

数论快速入门(同余、扩展欧几里德、中国剩余定理、大素数测定和整数分解、素数三种筛法、欧拉函数以及各种模板)

数学渣渣愉快的玩了一把数论,来总结一下几种常用的算法入门,不过鶸也是刚刚入门, 所以也只是粗略的记录下原理,贴下模板,以及入门题目(感受下模板怎么用的) (PS:文中蓝色字体都可以点进去查看百度原文) 附赠数论入门训练专题:点我打开专题(题目顺序基本正常,用以配套数论入门) 一.同余定理 简单粗暴的说就是:若 a-b == m 那么 a%m == b%m 这个模运算性质一眼看出...直接上入门水题: Reduced ID Numbers 附AC代码(这个也没啥模板....知道就好) #inclu

手机游戏闯三国(乱世之刃)客户端+ 服务端源码 + 完整策划文档

闯三国(乱世之刃)客户端源码 + 服务端源码 + 完整策划文档) 乱世之刃源代码下载 <乱世之刃2>即将在近期上线了,为了让玩家感触最顺利的游戏体会,游戏商已做好了全部的准备,11月20日进行封测.[2] 游戏称号 浊世之刃 游戏种类 横版格斗游戏 游戏平台 iOS.Android 开发商 Xiamen Yidou 发行时刻 2012-11-15 适宜年纪 12岁以上 语    言 中文 安卓iOS游戏源码下载 目录 1 游戏介绍 2 游戏简介 ? 游戏布景 ? IOS有关信息 ? 游戏特征

Oracle笔记(三)单行函数

-函数 函数像一个黑盒子一样(看不到里边的构造),有参数返回值,可以为我们完成一定的功能. -单行 这种函数会对结果中的每一行计算一次,每行返回一个结果,单行概念区别于分组函数. 单行函数主要分为以下五类:字符函数.数字函数.日期函数.转换函数.通用函数: 一.字符型函数 ---字符处理-大小写转换 例子:写一个SQL,将'I love Sql'转换成全大写,全小写和首字母大写的形式. SELECT UPPER ('I love Sql'),LOWER('I love Sql'),INITCAP

Oracle学习(三):单行函数

1.知识点:可以对照下面的录屏进行阅读 SQL> --字符函数 SQL> --字符串的转换 SQL> select lower('hellO WORld') 转小写,upper('hellO WORld') 转大写,initcap('hello world') 首字母大写 2 from dual; SQL> --substr(a,b) 从a中,第b位开始取,取右边所有的字符 SQL> select substr('Hello World',4) from dual; SQL&

qt学习(一)qt三个文件函数的框架

学到点什么, 而不是复制着什么, 每天敲着别人给的代码,苦涩得改完bug, 就这样一天天的过去, 实质上并没有学到什么, 别人的思想只是拿来借鉴, 你的思想是好是坏都是你的, 不用急着抛弃自己. 从qt看看人家的思路. Qt编程思路: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~` 以下:xxx.h ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

【C语言天天练(三)】函数

对于程序来讲,函数的地位是不言而喻的.下面先给出函数的定义,然后根据定义分析C语言中的函数. 函数定义: 类型 函数名(形式参数) 代码块 由定义可以看出函数主要包括四部分:函数类型.函数名.函数形参.函数代码块. 函数类型:指明了函数返回值的类型,是整数.浮点数.指针甚至是结构体等等.需要注意的两点:1.如果类型是void,则没有返回值.如果是void *型的返回值,那可以返回任意类型的指针,这是ANSI C标准定义的,void *可以是任意类型的指针.2.返回值的类型应该与函数定义的类型相同

算法-分析三种不同函数形式

三种定义函数的方式 function语句形式 函数直接量形式 通过Function构造函数形式定义函数 比较三种方式定义的区别              function语句     Function构造函数          函数直接量          兼容            完全               js1.1以上           js1.2以上版本  形式            句子               表达式                表达式 名称     

SQL Server之 (三) 分组 类型转换函数 插入多条数据 字符串函数

SQL Server之 (三)  分组 类型转换函数  插入多条数据  字符串函数 自己学习笔记,转载请注明出处,谢谢!---酸菜 1.SQL 数据分组----Group by /Having  ①有一学生信息表:StuID/StuName/StuAge/StuGender/StuClassID; 求每个班级的ID和对应人数:select StuClassID 班级ID,count(*) 班级人数  from StuInfo group by StuClassID ; 求所有同学中男女同学对应人