ZZNU 1988: Sn
Posted 惟愿。。。
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ZZNU 1988: Sn相关的知识,希望对你有一定的参考价值。
题目描述
给你两个数 n, p(0 < n,p <= 10^15);
a1 = 1;
a2 = 1+2;
a3 = 1+2+3;
...
an = 1+2+3+...+n
Sn = a1+a2+a3+...+an;
求(6*Sn) % p;
输入
输入一个数 T表示有T组实例;
每组样例输入两个整数 n , p
输出
输出结果;
样例输入 2 1 1234567 2 1234567 样例输出 6 24
题目链接:http://acm.zznu.edu.cn/problem.php?id=1988
*********************************************
分析:公式n*(n+1)*(n+2)%p;
两个 long long 的数直接相乘会爆long long,所以两两相乘。
AC代码:
1 #include <iostream> 2 #include <algorithm> 3 #include <cstdio> 4 #include <cstring> 5 #include<limits.h> 6 #include <cmath> 7 #include <cstdlib> 8 #include <stack> 9 #include <vector> 10 #include <queue> 11 #include <map> 12 13 using namespace std; 14 15 #define N 2000000 16 #define INF 0x3f3f3f3f 17 #define met(a, b) memset (a, b, sizeof (a))//// met (dist, -1); 18 #define LL long long 19 20 LL q(LL a,LL b,LL p) 21 { 22 if(b==0) 23 return 0; 24 25 LL ans=2*q(a,b/2,p)%p; 26 27 if(b%2) 28 ans=(ans+a)%p; 29 return ans; 30 } 31 int main() 32 { 33 int T; 34 LL n,p; 35 36 scanf("%d", &T); 37 38 while(T--) 39 { 40 scanf("%lld %lld", &n,&p); 41 42 LL ans=q(n+1,n,p); 43 ans=q(ans,n+2,p); 44 printf("%lld\n", ans); 45 } 46 return 0; 47 } 48 ///公式n*(n+1)*(n+2)%p; 49 ///两个 long long 的数直接相乘会爆long long;所以两两相乘
以上是关于ZZNU 1988: Sn的主要内容,如果未能解决你的问题,请参考以下文章