NYOJ 420 p次方求和 (快速幂+同余定理)

题目描述:

http://acm.nyist.net/JudgeOnline/problem.php?pid=420

一个很简单的问题,求1^p+2^p+3^p+……+n^p的和。

输入
第一行单独一个数字t表示测试数据组数。接下来会有t行数字,每行包括两个数字n,p,

输入保证0<n<=1000,0<=p<=1000。

输出
输出1^p+2^p+3^p+……+n^p对10003取余的结果,每个结果单独占一行。
样例输入
210 110 2
样例输出
55385

题目分析:

快速幂+同余定理的问题,虽然已经写了好多次的快速幂但是还是没有记住,每次都是看模板,这次一定记住它。

AC代码:

/**
 *快速幂取摸+同余
 */
#include<iostream>
#include<cstdio>
#include<map>
#include<cstring>
#include<string>
#include<algorithm>
#include<queue>
#include<vector>
#include<stack>
#include<cstdlib>
#include<cctype>
#include<cstring>
#include<cmath>
using namespace std;
int mod(int a,int b,int n){
    int t = 1;
    if (b == 0)
        return 1;
    if (b == 1)
         return a%n;
    t = mod(a, b>>1, n);
    t = t*t % n;
    if (b&1){//b是奇数
        t = t*a % n;
    }
    return t;
 }

int main()
{
    int t;
    cin>>t;
    while(t--){
        int p,n;
        cin>>n>>p;
        int res=0;
        for(int i=1;i<=n;i++){
            int t=mod(i,p,10003);
            //cout<<t<<endl;
            res=(res%10003+t%10003)%10003;
        }
        cout<<res<<endl;
    }
	return 0;
}
        
时间: 2024-12-05 23:47:44

NYOJ 420 p次方求和 (快速幂+同余定理)的相关文章

NYOJ 420 P次方求和

p次方求和 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 一个很简单的问题,求1^p+2^p+3^p+--+n^p的和. 输入 第一行单独一个数字t表示测试数据组数.接下来会有t行数字,每行包括两个数字n,p, 输入保证0<n<=1000,0<=p<=1000. 输出 输出1^p+2^p+3^p+--+n^p对10003取余的结果,每个结果单独占一行. 样例输入 2 10 1 10 2 样例输出 55 385 AC码: #include<std

nyoj 420 p次方求和 【快速幂】

题意... 策略:rt 代码: #include <stdio.h> #include <string.h> #define temp 10003 int ans(int n, int p){ int res = 1; n %= temp; while(p){ if(p&1) res = (n*res)%temp; n = (n*n)%temp; p /= 2; } return res; } int main(){ int t, n, p; scanf("%d&

poj 1845 Sumdiv (同余定理,快速幂取余)

链接:poj 1845 题意:求A^B的所有因子的和对9901取余后的值 如:2^3=8,8的因子有 1,2,4,8,所有和为15,取余后也是15 应用定理主要有三个: (1)整数的唯一分解定理: 任意正整数都有且只有一种方式写出其素因子的乘积表达式. A=(p1^k1)*(p2^k2)*(p3^k3)*....*(pn^kn)   其中pi均为素数 (2)约数和公式: 对于已经分解的整数A=(p1^k1)*(p2^k2)*(p3^k3)*....*(pn^kn) 有A的所有因子之和为 S = 

HDU1061_Rightmost Digit【快速幂取余】

Rightmost Digit Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 33161    Accepted Submission(s): 12696 Problem Description Given a positive integer N, you should output the most right digit of

hdu 2817 A sequence of numbers(快速幂取余)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2817 题目大意:给出三个数,来判断是等差还是等比数列,再输入一个n,来计算第n个数的值. 1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 #define m 200907 5 6 using namespace std; 7 8 __int64 fun(__int64 j,__int64 k) 9

快速幂取余 [转]

转自: http://blog.csdn.net/acm_code/article/details/38270829 求a^b mod c 算法1. 首先直接地来设计这个算法: int ans=1, i; for(i=1;i<=b;i++) ans*=a; ans%=c; 这个算法的时间复杂度体现在for循环中,为O(b). 这个算法存在着明显的问题,如果a和b过大,很容易就会溢出. 那么,我们先来看看第一个改进方案:在讲这个方案之前,要先有这样一个公式: a^b mod c=(a mod c)

LightOJ - 1282 - Leading and Trailing(数学技巧,快速幂取余)

链接: https://vjudge.net/problem/LightOJ-1282 题意: You are given two integers: n and k, your task is to find the most significant three digits, and least significant three digits of nk. 思路: 后三位快速幂取余,考虑前三位. \(n^k\)可以表示为\(a*10^m\)即使用科学计数法. 对两边取对数得到\(k*log

模板 快速幂|取余

前置知识 (1)如果将 aa 自乘一次,就会变成 a^2a2 .再把 a^2a2 自乘一次就会变成 a^4a4 .然后是 a^8a8…… 自乘 nn 次的结果是 a^{2^{n}}a2n .对吧…… (2)a^xa^y = a^{x+y}axay=ax+y,这个容易. (3)将 bb 转化为二进制观看一下: 比如 b = (11)_{10}b=(11)10? 就是 (1011)_{2}(1011)2? .从左到右,这些 11 分别代表十进制的 8,2,18,2,1.可以说 a^{11} = a^

快速幂取余算法

下面是一个快速幂的介绍: 先贴一个秦九韶算法(Horner算法)的原理: 设有项的次函数 将前项提取公因子,得 再将括号内的前项提取公因子,得 如此反复提取公因子,最后将函数化为 令 ...... 则即为所求 下面是讲解快速幂的:(By  夜せ︱深   感谢作者) 快速幂取模算法 在网站上一直没有找到有关于快速幂算法的一个详细的描述和解释,这里,我给出快速幂算法的完整解释,用的是C语言,不同语言的读者只好换个位啦,毕竟读C的人较多~ 所谓的快速幂,实际上是快速幂取模的缩写,简单的说,就是快速的求