先上题目:

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. Java 判断中文字符

    Java判断一个字符串中是否有中文字符有两种方法,但是原理都一样,就是通过Unicode编码来判断,因为中文在Unicode中的编码区间为:0x4e00--0x9fa5 第一种: String chi ...

  2. bzoj5038 四叶草魔杖

    很有意思的最小生成树啊. 网上的题解大多是状压+最小生成树,经过我的试验,其实只要把每个联通块找出来,一个个做一次就可以了. 放一个状压的.懒得再写一个搜索找联通块 #include<cstdi ...

  3. 杂项:MIS(管理信息系统)

    ylbtech-杂项:MIS(管理信息系统) 管理信息系统(Management Information System,简称MIS)是一个以人为主导,利用计算机硬件.软件.网络通信设备以及其他办公设备 ...

  4. Linux防火墙设置

    对于Internet上的系统,不管是什么情况都要明确一点:网络是不安全的.因此,虽然创建一个防火墙并不能保证系统100%安全,但却是绝对必要的. Linux提供了一个非常优秀的防火墙工具-netfil ...

  5. Stick ------ 剪枝神题

    这个是自己剪得 , 我感觉已经很不错了  但是不知道哪里出了问题  一直  超时 // 根据所给答案 和 题目要求 最直观的就可以有剪枝的地方 而且 剪枝剪得越早 就越省时省力 // 好的思路也可以省 ...

  6. 扩展银行项目,添加一个(客户类)Customer类。Customer类将包含一个Account对象。

    练习目标-使用引用类型的成员变量:在本练习中,将扩展银行项目,添加一个(客户类)Customer类.Customer类将包含一个Account对象. 任务 在banking包下的创建Customer类 ...

  7. dubbo之启动时检查

    启动时检查 Dubbo缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止Spring初始化完成,以便上线时,能及早发现问题,默认 check="true".所以可以通过 ...

  8. 图像局部显著性—点特征(FREAK)

    参考文章:Freak特征提取算法  圆形区域分割 一.Brisk特征的计算过程(参考对比): 1.建立尺度空间:产生8层Octive层. 2.特征点检测:对这8张图进行FAST9-16角点检测,得到具 ...

  9. slf4j日志只输出到控制台,没输出到日志文件

    最近使用SLF4J遇到了一个比较头疼的坑,日志输出到控制台没有问题,但是始终没有输出到日志文件.无论怎麽修改日志配置,始终是老样子. 有一种绝望,是各种百度.google却还是解决不了问题..直到我在 ...

  10. raspberry pi树莓派设置

    买了个pi3b 安装系统 需要class10 TF卡.读卡器 下载系统并解压Raspbianhttps://www.raspberrypi.org/downloads/raspbian/访问慢的话请用 ...