Fzu1759 Super A^B mod C 题解

  • 题目大意

    以若干行的形式给定若干组a,b,c(你不知道有多少组),输出若干行,每行代表相应的abmodc的值。其中1≤a,c≤1000000000,1≤b≤101000000

  • 评测网址

http://acm.fzu.edu.cn/problem.php?pid=1759

  • 题解

    数据真的很大。。。。。

    不过我们有公式:

    abmodc=a(bmodφ(c))+φ(c)modc,b≥φ(c);

    把它记为(*)式。

    我们可以把b先用字符串ch读入,再从高位到低位处理:

for(int i = 0; i < strlen(ch); ++i)
{
    b = b * 10 + ch[i] - 48;
    b %= phi(c);
}
  • 这很好理解,因为若一个数可以被φ(c)整除,这个数又是一个大数的前面若干位,那么这个大数前面若干位一定也可以被φ(c)整除,那么直接把这几位丢掉即可。所以可以对ch串边扩大边取模,得到的b就自然在φ(c)的范围内了。根据(*)式,这样不影响正确答案,然后上快速幂即可A掉本题。
  • 注意事项

    提交时若使用scanf或printf输出long long或__int64,不能用”%lld”,只能用”%I64d”。

  • Code
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#define ll long long
using namespace std;
char ch[1000010];
inline ll singleEulerPhi(ll a)
{
    ll ans = a;
    for(ll i = 2; i <= (ll)sqrt(a * 10); ++i) if(a % i == 0)
    {
        ans = ans / i * (i - 1);
        while(a % i == 0) a /= i;
    }
    if(a > 1) ans = ans / a * (a - 1);
    return ans;
}
inline ll quickPow(ll a, ll b, ll m)
{
    ll ans = 1;
    for(ll t = a; b; b >>= 1, t = (t % m) * (t % m) % m)
        if(b & 1) ans = (ans % m) * (t % m) % m;
    return ans;
}
inline void write(ll a)
{
    int top = 0;
    char ch[50];
    if(a < 0)
    {
        putchar(‘-‘);
        a = -a;
    }
    do {
        ch[top++] = a%10 + 48;
        a /= 10;
    } while(a);
    while(top--) putchar(ch[top]);
    putchar(‘\n‘);
}
int main()
{
    ll a, b, c, phi, len;
    while(scanf("%I64d", &a) == 1)
    {
        scanf("%s", &ch); scanf("%I64d", &c);
        len = strlen(ch); phi = singleEulerPhi(c);
        b = 0LL;
        for(int i = 0; i < len; ++i)
        {
            b = b * 10 + ch[i] - 48;
            b %= phi;
        }
        write(quickPow(a, b, c));
    }
    return 0;
}
时间: 2024-12-27 03:49:08

Fzu1759 Super A^B mod C 题解的相关文章

fzu1759 Super A^B mod C 扩展欧拉定理降幂

扩展欧拉定理: \[ a^x \equiv a^{x\mathrm{\ mod\ }\varphi(p) + x \geq \varphi(p) ? \varphi(p) : 0}(\mathrm{\ mod\ }p)\] #include <iostream> #include <cstring> #include <cstdio> using namespace std; typedef long long ll; ll aa, cc; char bb[100000

FZU-1759 Super A^B mod C---欧拉降幂&amp;指数循环节

题目链接: https://cn.vjudge.net/problem/FZU-1759 题目大意: 求A^B%C 解题思路: 注意,这里long long需要用%I64读入,不能用%lld 1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstring> 5 using namespace std; 6 typedef long long ll; 7 const in

FZU - 1759 Super A^B mod C 降幂公式

知道降幂公式这题就很好办了 B>=Phi(c)的时候可以降幂然后快速幂计算,否则就直接快速幂计算. 这里的大数对小数取模直接利用取模性质按位取就行了. //A^B %C=A^( B%phi(C)+phi(C) ) %C #include <cstdlib> #include <cstring> #include <cstdio> #include <iostream> #include<string> #include<cmath&g

Super A^B mod C

Given A,B,C, You should quickly calculate the result of A^B mod C. (1<=A,C<=1000000000,1<=B<=10^1000000). Input There are multiply testcases. Each testcase, there is one line contains three integers A, B and C, separated by a single space. Out

FUZ 1759 Super A^B mod C (指数循环节/模板)

题意:求A^B mod C,其中(1<=A,C<=1000000000,1<=B<=10^1000000). 思路: 在有些题目中我们需要对指数进行降幂处理才能计算.比如计算 其中和 这里由于很大,所以需要进行降幂.那么实际上有如下降幂公式 有了上述公式,很多题目就可以迎刃而解了. 摘自ACdreamer博客 代码: #include <iostream> #include <string.h> #include <stdio.h> using

Super A^B mod C 快速幂+欧拉函数降幂

uper A^B mod C Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Description Given A,B,C, You should quickly calculate the result of A^B mod C. (1<=A,C<=1000000000,1<=B<=10^1000000). Input There are

[转] POJ数学问题

转自:http://blog.sina.com.cn/s/blog_6635898a0100magq.html 1.burnside定理,polya计数法 这个大家可以看brudildi的<组合数学>,那本书的这一章写的很详细也很容易理解.最好能完全看懂了,理解了再去做题,不要只记个公式. *简单题:(直接用套公式就可以了) pku2409 Let it Bead      http://acm.pku.edu.cn/JudgeOnline/problem?id=2409 pku2154 Co

『转』数学专辑

1.burnside定理,polya计数法 这个大家可以看brudildi的<组合数学>,那本书的这一章写的很详细也很容易理解.最好能完全看懂了,理解了再去做题,不要只记个公式. *简单题:(直接用套公式就可以了) pku2409 Let it Bead   http://acm.pku.edu.cn/JudgeOnline/problem?id=2409 pku2154 Color http://acm.pku.edu.cn/JudgeOnline/problem?id=2154 pku12

ACM数学(转)

从放暑假前周sir给我讲了一个用polya计数法和burnside定理做的题目(pku2409)后,突然觉得组合数学挺有意思,然后从那时起到现在几乎都在做这类的题目. 做到现在感觉这类题目的一些基本知识点都差不多有所了解了,水题也刷了不少,但还有很多难题自己实在是做不动,所以准备把这类题目先放一放,然后把前段时间做的水题整理一下(供以后的初学者参考,大牛就不要看了哈,都是水题).剩下的比较难的题目就慢慢来吧,以后做出来再不上,这个小结会不断地更新.也希望大家有好的题目可以推荐一下,分享一下哈.