先上题目:

Power Sum

Time Limit: 20000/10000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others)
SubmitStatus

Problem Description

给出n,m,p,求 (1^m + 2^m + 3^m + 4^m + ... + n^m) % p

Input

第一行一个数T( <= 10),表示数据总数

然后每行给出3个数n,m,p(1 <= n <= m <= 10^18, 1 <= p <= 10^6, p是质数

Output

每组数据输出你求得的结果

Sample Input

2
1 1 11
3 2 11

Sample Output

1
3

Hint

i^m即求 i * i * i * i * i... * i(m个i),比如2^3即2 * 2 * 2 
 
  分析,首先n很大,但是这个求和需要模p,所以我们可以考虑将求和范围压缩在0~p-1中间,然后求出结果以后乘上倍数再加上剩余部分就可以了。但是这样时间复杂度还会是很大。这里还可以用欧拉定理来优化。
  n,a为正整数,且n,a互质,则:    

 
  
  
 
  因为这里我们已经已经将求和范围压缩在0~p-1里面了,同时因为p是一个质数,所以我们知道1~p-1的数都符合上述的公式。对于求次幂,我们可以用快速幂,这样问题就基本解决了。这就是标准解法。问题是我用这种方法结果还是超时了,主要问题好像是取模太多了。
 
  于是我又想出另一种解法对于每一个数都可以分解成素数相乘,那我们先压缩数据在0~p-1之间,然后就可以将这些数分解成质数的幂相乘,然后我们可以想素数筛法那样求一遍,最终就可以得到结果。这种方法之所以可以使用是因为10^6一下的质数大概有1.2*10^5这么多个,不算多,所以可行。同时这种方法相对于前面的方法速度上应该会更快。前一种方法的时间复杂度大概是O(p*logp),后一种方法的时间复杂度大概是O(ploglogp),接近O(p)。
 
 
 
 
 
 
上代码:
 
 #include <cstdio>
#include <cstring>
#include <iostream>
#define LL long long
#define MAX 1000002
using namespace std; LL n,m,p,ti; bool f[MAX];
LL mm[MAX];
LL ans,rr,r; LL Fast_Mod(LL i,LL t){
LL a = ;
while(t){
if(t&) a = i*a%p;
i = (i%p)*(i%p)%p;
t>>=;
}
return a;
} void solve1(){
ans=;
memset(f,,sizeof(f));
for(int i=;i<=p;i++) mm[i]=;
LL u;
f[]=;
for(LL i=;i<=p;i++){
if(!f[i]){
mm[i] = Fast_Mod(i,m);
for(LL j=i+i;j<=p;j+=i){
f[j]=;
u = j;
while(u%i==){
u/=i;
mm[j]=mm[j]*mm[i]%p;
}
}
}
ans = (ans + mm[i])%p;
if(i<=r) rr=ans;
}
} void solve2(){
ans=;
memset(f,,sizeof(f));
for(int i=;i<=r;i++) mm[i]=;
LL u;
f[]=;
for(LL i=;i<=r;i++){
if(!f[i]){
mm[i] = Fast_Mod(i,m);
for(LL j=i+i;j<=r;j+=i){
f[j]=;
u = j;
while(u%i==){
u/=i;
mm[j]=mm[j]*mm[i]%p;
}
}
}
ans = (ans + mm[i])%p;
}
} int main()
{
int t;
//freopen("data.txt","r",stdin);
scanf("%d",&t);
while(t--){
scanf("%lld %lld %lld",&n,&m,&p);
ti = n/p;
r = n%p;
rr=;
if(ti!=){
solve1();
ans = (ans*ti)%p;
ans = (ans+rr)%p;
}else{
solve2();
}
printf("%lld\n",ans);
}
return ;
}

Power Sum

 
 
 
 

ACDream - Power Sum的更多相关文章

  1. Power Sum 竟然用原根来求

    Power Sum Time Limit: 20000/10000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) SubmitS ...

  2. acdream Divide Sum

    Divide Sum Time Limit: 2000/1000MS (Java/Others)Memory Limit: 128000/64000KB (Java/Others) SubmitSta ...

  3. ACdream: Sum

    Sum Time Limit: 2000/1000MS (Java/Others)Memory Limit: 128000/64000KB (Java/Others) SubmitStatisticN ...

  4. acdream 1431 Sum vs Product

    Sum vs Product Time Limit: 4000/2000MS (Java/Others)Memory Limit: 128000/64000KB (Java/Others) Submi ...

  5. ACdream 1431——Sum vs Product——————【dfs+剪枝】

    Sum vs Product Time Limit: 2000/1000MS (Java/Others)    Memory Limit: 128000/64000KB (Java/Others) S ...

  6. ACDream - Lowbit Sum

    先上题目: C - Lowbit Sum Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others ...

  7. hdu3208 Power of Integer

    /** 题目:H - Power of Integer 链接:https://vjudge.net/contest/152887#problem/H 题意:给出区间[a, b],问你区间[a, b]所 ...

  8. 加州大学伯克利分校Stat2.3x Inference 统计推断学习笔记: FINAL

    Stat2.3x Inference(统计推断)课程由加州大学伯克利分校(University of California, Berkeley)于2014年在edX平台讲授. PDF笔记下载(Acad ...

  9. JavaScript基础--简单功能的计算器(十一)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

随机推荐

  1. Nginx1.6 for centos6.5安装

    Nginx 学习文档:http://www.cnblogs.com/zhoulf/archive/2013/02/09/2909653.html 下载地址:http://nginx.org/en/do ...

  2. CF 86D 莫队(卡常数)

    CF 86D 莫队(卡常数) D. Powerful array time limit per test 5 seconds memory limit per test 256 megabytes i ...

  3. Codeforces--629A--Far Relative’s Birthday Cake(暴力模拟)

    Far Relative's Birthday Cake Time Limit: 1000MS   Memory Limit: 262144KB   64bit IO Format: %I64d &a ...

  4. linux下如何使用sftp命令进行文件上传和下载

    sftp 是一个交互式文件传输程式.它类似于 ftp, 但它进行加密传输,比FTP有更高的安全性.下边就简单介绍一下如何远程连接主机,进行文件的上传和下载,以及一些相关操作. 举例,如远程主机的 IP ...

  5. bzoj2287【POJ Challenge】消失之物(退背包)

    2287: [POJ Challenge]消失之物 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 657  Solved: 382[Submit][S ...

  6. 想要学好C/C++,我到底要看多少书才能成为一个合格的C/C++工程师?

    如何学好C语言 这可能是很多朋友的问题,我以前也有这样的感觉,编程编到一定的时候,发现能力到了瓶颈,既不深,也不扎实,半吊子.比如:你长期地使用Java和.NET ,这些有虚拟机的语言对于开发便利是便 ...

  7. Netty引导流程解读

    Channel的生命周期状态[状态转换将变为相应的事件,转发给ChannelPipeline中的ChannelHandler进行处理] ChannelUnregistered:Channel已经被创建 ...

  8. [BZOJ1821][JSOI2010]部落划分

    感觉学了这么久还是有那么一丢丢进步的...上个学期看到这道题,虽然早就学过并查集和二分了但还是一点思路都没有,现在可以秒切了呢 思路就是二分+并查集,有些人说是生成树,其实它没有变成树,只是运用了生成 ...

  9. BZOJ 3653 主席树

    思路: (抄一波公式) $$ans=min(dep[x],k)×(size[x]-1)+\sum_{y在x的子树中,且dis(x,y)<=k}(size[y]-1)$$ 顺着DFS序 按照dee ...

  10. lua 10进制转换成其它进制table表示

    -- params@num integer -- ~) 默认为10 -- NOTE:先不输出符号 function NumberToArray(num, radix) if type(num) ~= ...