HDU 4704 Sum 超大数幂取模
很容易得出答案就是2^(n-1)
但是N暴大,所以不可以直接用幂取模,因为除法操作至少O(len)了,总时间会达到O(len*log(N)) 显然爆的一塌糊涂
套用FZU1759的模板+顺手写一个大数-1
http://acm.fzu.edu.cn/problem.php?pid=1759
标程的做法是用费马小定理 , ap-1≡1(mod p)
那么2(1e9+6)%(1e9+7) = 1
很容易得出 2k%(10e+7) = 2k%(10e+6)%(10e+7)
然后就能用快速幂了 但FZU那题显然不是这么水的...我暂时也没看懂是怎么做的
现在看懂这个意思了,根据著名的欧拉公式:A^PHI(C)=1(MOD C) 条件:(A,C)=1
我们可以得出以下公式 
那么这题就能做了..显然是以Phi(c)作为循环节 ... 但我还是没理解当(A,C)!=1时这个公式的成立性 ....prpr
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#define LL long long
#define nnum 100005
#define nmax 131625
int flag[nmax], prime[nmax];
char ch[nnum];
int plen;
void mkprime() {
int i, j;
memset(flag, -, sizeof(flag));
for (i = , plen = ; i < nmax; i++) {
if (flag[i]) {
prime[plen++] = i;
}
for (j = ; (j < plen) && (i * prime[j] < nmax); j++) {
flag[i * prime[j]] = ;
if (i % prime[j] == ) {
break;
}
}
}
}
int getPhi(int n) {
int i, te, phi;
te = (int) sqrt(n * 1.0);
for (i = , phi = n; (i < plen) && (prime[i] <= te); i++) {
if (n % prime[i] == ) {
phi = phi / prime[i] * (prime[i] - );
while (n % prime[i] == ) {
n /= prime[i];
}
}
}
if (n > ) {
phi = phi / n * (n - );
}
return phi;
}
int cmpCphi(int p, char *ch) {
int i, len;
LL res;
len = strlen(ch);
for (i = , res = ; i < len; i++) {
res = (res * + (ch[i] - ''));
if (res > p) {
return ;
}
}
return ;
}
int getCP(int p, char *ch) {
int i, len;
LL res;
len = strlen(ch);
for (i = , res = ; i < len; i++) {
res = (res * + (ch[i] - '')) % p;
}
return (int) res;
}
int modular_exp(int a, int b, int c) {
LL res, temp;
res = % c, temp = a % c;
while (b) {
if (b & ) {
res = res * temp % c;
}
temp = temp * temp % c;
b >>= ;
}
return (int) res;
}
void solve(int a, int c, char *ch) {
int phi, res, b;
phi = getPhi(c);
if (cmpCphi(phi, ch)) {
b = getCP(phi, ch) + phi;
} else {
b = atoi(ch);
}
res = modular_exp(a, b, c);
printf("%d\n", res);
}
char* sub(char ch[]){
int len = strlen(ch);
int fl = ;
char x[nnum];
for(int i = len- ; i >= ; i--){
x[i] = ((ch[i] - fl - '') + ) % + '';
if((ch[i] - fl - '') < ) fl = ;
else fl = ;
}
x[len] = '\0';
if(x[] == '') return x+;
return x;
}
int main() {
int a = , c = ;
mkprime();
while (~scanf("%s",ch)) {
char x[nmax];
strcpy(x,sub(ch));
//puts(x);
solve(a % c, c, x);
}
return ;
}
HDU 4704 Sum 超大数幂取模的更多相关文章
- HDU 1061 Rightmost Digit --- 快速幂取模
HDU 1061 题目大意:给定数字n(1<=n<=1,000,000,000),求n^n%10的结果 解题思路:首先n可以很大,直接累积n^n再求模肯定是不可取的, 因为会超出数据范围, ...
- HDU 4704 Sum (高精度+快速幂+费马小定理+二项式定理)
Sum Time Limit:1000MS Memory Limit:131072KB 64bit IO Format:%I64d & %I64u Submit Status ...
- hdu 3221 Brute-force Algorithm(高速幂取模,矩阵高速幂求fib)
http://acm.hdu.edu.cn/showproblem.php?pid=3221 一晚上搞出来这么一道题..Mark. 给出这么一个程序.问funny函数调用了多少次. 我们定义数组为所求 ...
- hdu 4506 小明系列故事——师兄帮帮忙【幂取模乱搞】
链接: http://acm.hdu.edu.cn/showproblem.php?pid=4506 http://acm.hust.edu.cn/vjudge/contest/view.action ...
- hdu 1097 A hard puzzle 快速幂取模
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1097 分析:简单题,快速幂取模, 由于只要求输出最后一位,所以开始就可以直接mod10. /*A ha ...
- 快速幂取模(当数很大时,相乘long long也会超出的解决办法)
当几个数连续乘最后取模时,可以将每个数字先取模,最后再取模,即%对于*具有结合律.但是如果当用来取模的数本身就很大,采取上述方法就不行了.这个时候可以借鉴快速幂取模的方法,来达到大数相乘取模的效果. ...
- UVa 11582 巨大的斐波那契数!(幂取模)
https://vjudge.net/problem/UVA-11582 题意: 输入两个非负整数a.b和正整数n,你的任务是计算f(a^b)除以n的余数.f[0]=0,f[1]=1,f[i+2]=f ...
- HDU 1061.Rightmost Digit-规律题 or 快速幂取模
Rightmost Digit Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- 题解报告:hdu 1061 Rightmost Digit(快速幂取模)
Problem Description Given a positive integer N, you should output the most right digit of N^N. Input ...
随机推荐
- Linux 运维笔试题(一)
试题: 1.说出下列服务对应的端口或者端口对应的服务 21 23 25 873 161 111 110 53 123 2049 2.文件atime,ctime,mtime的区 ...
- MD5工具类-详细
public class MD5Code { /* * 下面这些S11-S44实际上是一个4*4的矩阵,在原始的C实现中是用#define 实现的, 这里把它们实现成为static * final是表 ...
- SSD-tensorflow-2 evaluation
测试就是用voc2007的test set来测试已经训练好的checkpoint的mAP,github上提供了三个已经训练好的model的checkpoint checkpoint 里面已有的300_ ...
- luoguP1462通往奥格瑞玛的道路(二分答案+spfa)
题意 给出n个点m条边的无向图. 每条边有两个权值a,b; 问在保证从1到n的路径a权值和小于x时,路径上b权值最大值最小为多少. (n≤10000,m≤50000,x≤1000000000) 题解 ...
- Rman备份异机恢复
最后更新时间:2018/12/29 前置条件 已准备一台安装好Centos6+oracle11gr2 软件的服务器; 只安装了 oracle 数据库软件,需要手工创建以下目录: #环境变量 expor ...
- string.split 应用
采用string.split将字符串依据分隔符,转换成字符串数组,生成的字符串数组中会包含空数组元素,需要通过StringSplitOptions.RemoveEmptyEntries参数选项去除. ...
- 减少UIViewController切换的耦合
我们一般切换UIViewController的时候用的是例如以下代码 #import "UIViewControllerDemo.h" UIViewControllerDemo * ...
- 如何调试Blink?
内容 尽管有很多工具和技巧可用于调试Blink,这个文章的重点调试Blink除布局測试之外的feature. 1 介绍 2 Linux 2.1 入门 2.2 启动Debugger 3 实用的工具 3. ...
- vim 插件之 surround.vim
surround.vim-这个插件主要是用来插入一些特殊符号的(成对出现) 下载地址 http://www.vim.org/scripts/script.php?script_id=1697 http ...
- mysql简单优化思路
mysql简单优化思路 作为开发人员,数据库知识掌握的可能不是很深入,但是一些基本的技能还是要有时间学习一下的.作为一个数据库菜鸟,厚着脸皮来总结一下 mysql 的基本的不能再基本的优化方法. 为了 ...