洛谷 P1405 苦恼的小明

题目描述

黄小明和他的合伙人想要创办一所英语培训机构,注册的时候要填一张个人情况的表格,在身高一栏小明犯了愁。

身高要求精确到厘米,但小明实在太高了,无法在纸上填下这么长的数字。小明花钱买通了办事人员,于是只要写上他的身高模10007的结果就行了。

可小明不会取模,想起前几天请你帮他解决了水库的问题,于是又来找你帮忙。

输入输出格式

输入格式:

 

输入:(hehe.in)

小明的身高用A1^A2^...^An表示,第一行输入n,第二行输入n个正整数表示A1至An。

 

输出格式:

 

输出:(hehe.out)

一个数字表示小明身高mod 10007的值。

数据范围:

所有的0<=Ai<10000

第1~6数据点满足n=2

第7~10数据点满足n=3

第11个数据点满足n=1234567

(前六个数据会逐渐变大,照顾一下取模没弄清楚的同学。另外没有必要尝试对a1进行0或1的判断来骗分,估计是骗不到的。当然了,如果自认为运气好的人可以试试看,我

 

输入输出样例

输入样例#1: 复制
2										
17 747
输出样例#1: 复制
173

说明

数据范围:

所有的0<=Ai<10000

第1~6数据点满足n=2

第7~10数据点满足n=3

第11个数据点满足n=1234567

(前六个数据会逐渐变大,照顾一下取模没弄清楚的同学。另外没有必要尝试对a1进行0或1的判断来骗分,估计是骗不到的。当然了,如果自认为运气好的人可以试试看,我也阻止不了你。)

思路:快速幂+欧拉函数(费马小定理)。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define mod 10007
using namespace std;
long long m,x,n;
long long ans=1;
long long pow(long long a,long long b){
    long long s=1;
    for(;b;b>>=1){
        if(b&1)    s=s*a%mod;
        a=a*a%mod;
    }
    return s%mod;
}
int main(){
    scanf("%lld%lld",&n,&m);
    for(int i=2;i<=n;i++){
        scanf("%lld",&x);
        ans=ans*x;
    }
    cout<<pow(m,ans);
}
54分的快速幂
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define mod 10007
using namespace std;
int a[1234577];
int phi[10010],vis[10010],prime[10010];
int ans,tot,n;
int pre(){
    phi[1]=1;
    for(int i=2;i<=10010;i++){
        if(!vis[i]){ prime[++tot]=i;phi[i]=i-1;}
        for(int j=1;i*prime[j]<=10010;j++){
            vis[i*prime[j]]=1;
            if(i%prime[j]==0){
                phi[i*prime[j]]=phi[i]*prime[j];
                break;
            }    
            else    phi[i*prime[j]]=phi[i]*(prime[j]-1);
        }
    }
}
int pow(int a,int b,int p){
    int s=1;
    for(;b;b>>=1){
        if(b&1)    s=s*a%p;
        a=a*a%p;
    }
    return s;
}
int modex(int k,int x){
    if(x==n)    return a[x]%k;
    int kt=modex(phi[k],x+1);
    int tt=pow(a[x],kt,k);
    return tt;
}
int main(){
    pre();
    scanf("%d",&n);
    for(int i=1;i<=n;i++)    scanf("%d",&a[i]);
    ans=modex(mod,1);
    printf("%d",ans);
}

 

posted @ 2017-11-29 20:32  一蓑烟雨任生平  阅读(157)  评论(0编辑  收藏  举报