Power Sum 竟然用原根来求

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

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <string.h>
 4 #include <math.h>
 5 #include <algorithm>
 6 using namespace std;
 7 #define ll long long
 8 int fac[100],fn,pri[1100],pn=0;
 9 void init()
10 {
11     int i,j;
12     for(i=2;i<1100;i++)
13     {
14         if(!pri[i])
15         {
16             pri[pn++]=i;
17             j=i*i;
18             while(j<1100)
19             {
20                 pri[j]=1;
21                 j+=i;
22             }
23         }
24     }
25 }
26 void findfac(int x)
27 {
28     fn=0;
29     int i,j;
30     for(i=0;x>=pri[i]&&i<pn;i++)
31     {
32         if(x%pri[i]==0)
33         {
34             fac[fn++]=pri[i];
35             while(x%pri[i]==0)x/=pri[i];
36         }
37     }
38     if(x!=1)fac[fn++]=x;
39 }
40 ll power(ll x,ll y,ll mod)
41 {
42     ll ans=1;
43     while(y)
44     {
45         if(y&1)
46         {
47             ans*=x;
48             ans%=mod;
49         }
50         x*=x;
51         x%=mod;
52         y>>=1;
53     }
54     return ans;
55 }
56 bool check(ll x,ll y)
57 {
58     ll z=y-1;
59     for(ll i=0;i<fn;i++)
60     if(power(x,z/fac[i],y)==1)return 0;
61     return 1;
62 }
63 int findroot(int x)
64 {
65     if(x==2)return 1;
66     findfac(x-1);
67     for(ll i=2;;i++)
68     if(check(i,x))return i;
69 }
70 int poww[1100000],repow[1100000];
71 int dp[1100000];
72 int main()
73 {
74     init();
75     int t,root,i,j;
76     ll n,m,p;
77     scanf("%d",&t);
78     while(t--)
79     {
80         scanf("%lld%lld%lld",&n,&m,&p);
81         root=findroot(p);
82         m%=p-1;
83         int temp=1;
84         for(i=0;i<p;i++)
85         {
86             poww[i]=temp;
87             repow[temp]=i;
88             temp=temp*root%p;
89         }
90         dp[0]=0;
91         for(i=1;i<p;i++)
92         {
93           dp[i]=(dp[i-1]+poww[(repow[i]*m)%(p-1)])%p;
94         }
95         printf("%d\n",dp[n%p]);
96     }
97 }

Power Sum 竟然用原根来求

时间: 2024-10-05 19:48:59

Power Sum 竟然用原根来求的相关文章

ACDream - Power Sum

先上题目: 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

[LeetCode] Sum Root to Leaf Numbers 求根到叶节点数字之和

Given a binary tree containing digits from 0-9 only, each root-to-leaf path could represent a number. An example is the root-to-leaf path 1->2->3 which represents the number 123. Find the total sum of all root-to-leaf numbers. For example, 1 / 2 3 T

POJ 3233-Matrix Power Series(矩阵快速幂+二分求矩阵和)

Matrix Power Series Time Limit:3000MS     Memory Limit:131072KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 3233 Appoint description:  System Crawler  (2015-02-28) Description Given a n × n matrix A and a positive integer k, find the

HDU 1024 Max Sum Plus Plus【动态规划求最大M子段和详解 】

Max Sum Plus Plus Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 29942    Accepted Submission(s): 10516 Problem Description Now I think you have got an AC in Ignatius.L's "Max Sum" problem

[LeetCode] 129 Sum Root to Leaf Numbers 求根到叶节点数字之和

此题题意是求所有从根结点到叶节点的路径转化为数字后之和. 因为是二叉树,容易想到是用递归求解. 整体思想是从根到叶子进行遍历,其中不断保存当前的中间结果(上一层的结果乘以10后加上当前层根节点的数值)并通过参数向下传递... 到达叶子节点时可以逐层返回最终结果.解法不难,但有几个细节需要考虑清楚. 1)可以用递归函数dfs的参数表内置的返回和来返回数值,也可以直接用dfs返回值,对应于以下两种定义: void dfs(TreeNode *root, int &sum, int pre); int

LightOj 1278 - Sum of Consecutive Integers(求奇因子的个数)

题目链接:http://lightoj.com/volume_showproblem.php?problem=1278 题意:给你一个数n(n<=10^14),然后问n能用几个连续的数表示; 例如: 15 = 7+8 = 4+5+6 = 1+2+3+4+5,所以15对应的答案是3,有三种; 我们现在相当于已知等差数列的和sum = n, 另首项为a1,共有m项,那么am = a1+m-1: sum = m*(a1+a1+m-1)/2  -----> a1 = sum/m - (m-1)/2 a

HDU 5053 the Sum of Cube(数学求立方和)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5053 Problem Description A range is given, the begin and the end are both integers. You should sum the cube of all the integers in the range. Input The first line of the input is T(1 <= T <= 1000), whic

Max Sum Plus Plus---hdu1024(动态规划求M段的最大和)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1024 题意就是有n个数分成m段,求最大的和: dp[i][j]表示把 j 个数分成 i 段,选择第 j 个数的结果,而并不是当前的最优解, 那么要考虑的是第i个数的数是自己成一段还是和前面的成一段 所以dp[i][j]=max(dp[i][j-1]+a[j], Max+a[j]); 其中Max为前 j-1 个数字分成 i-1 段中的最大值: 由于题中n为100w,m不知道是多少,所以开二维数组可能不

UVA11149 Power of Matrix(快速幂求等比矩阵和)

题面 \(solution:\) 首先这一题是\(UVA11149\)的题目,建议到\(vjudge\)上去测,没办法\(UVA\)太难注册了.然后其原题与本题不是完全一样的,毒瘤卡输出!但思想一模一样! 首先,如果题目只要我们求\(A^K\) 那这一题我们可以直接模版矩乘快速幂来做,但是它现在让我们求$\sum_{i=1}^{k}{(A^i)} $ 所以我们思考一下这两者是否有什么关系.仔细一想,不难发现几个东西: 一次矩阵乘法复杂度为\(O(n^3)\),所以我们不能进行太多次矩阵乘法 快速