牛客练习赛52 A:数数(快速幂)
https://ac.nowcoder.com/acm/contest/1084/A
链接:https://ac.nowcoder.com/acm/contest/1084/A
来源:牛客网
题目描述
“你已经是一个成熟的孩子了,要学会自己数数了!”
输入描述:
多组数据。
第一行一个数 T(1<=T<=5),表示测试数据组数。
接下来 T行,每行一个数 n(1<=n<=1e7)。
输出描述:
对于每一组测试数据,输出一行两个数,即这组测试数据的答案。
示例1
输入
1
1
输出
1 1
解题思路:
第一问:
1*1+1*2+1*3+......+1*n+
2*1+2*2+2*3+.......+2*n+
....................................+
n*1+n*2+n*3+......+n*n = 1*n*(n+1)/2 + 2*n*(n+1)/2 + ......n*n*(n+1)/2。
第二问:
1*1 * 1*2 * 1*3 *......* 1*n *
2*1 * 2*2 * 2*3 * .......* 2*n *
....................................*
n*1 * n*2 * n*3 * ...... * n*n = (n!)^(2*n)。
奇数列上竖着相乘是n个n!,
偶数列上横着相乘是n个n!, 合并起来是(n!)^(2*n)。
#include <stdio.h>
long long poww(long long a, long long b)
{
long long c=a;
while(b) {
if(b%2 && b!=1)
c=(c*a)%998244353;
if(b/2) {
c=(c*a)%998244353;
a=(a*a)%998244353;
}
b=b>>1;
}
return c;
}
int main()
{
int t, n;
scanf("%d", &t);
while(t--) {
scanf("%d", &n);
long long ans1=0;
long long ans2=1;
long long sum = ((1ll * n * (n+1)) / 2)%998244353;
for(int i=1; i<=n; i++) {
ans1=(ans1 + 1ll * i * sum) % 998244353;
ans2=(ans2 * i) % 998244353;
}
printf("%lld %lld\n", ans1, poww(ans2, 2*n)%998244353);
}
return 0;
}