牛牛的算术(公式推导)

链接:https://ac.nowcoder.com/acm/contest/7079/B
来源:牛客网
 

时间限制:C/C++ 2秒,其他语言4秒
空间限制:C/C++ 524288K,其他语言1048576K
64bit IO Format: %lld

题目描述

牛牛最近学习了取模是什么 于是他看到了下面这一道题:

多次询问:每次询问包含一个正整数 nnn 要求你输出下列结果
∏i=1n∑j=1i∑k=1ji×j×k\prod_{i=1}^n \sum_{j=1}^i \sum_{k=1}^j i\times j\times k∏i=1n​∑j=1i​∑k=1j​i×j×k
为了避免结果过大 只需要输出这个式子对 199999199999199999(=2×32×41×271+1=2\times 3^2 \times 41 \times 271+1=2×32×41×271+1,一个质数) 取模的结果。

输入描述:

第一行一个正整数  TTT 表示询问次数。

接下来 TTT 行 每行一个正整数 nnn 含义如上所述

输出描述:

TTT 行非负整数 代表答案。

示例1

输入

复制5 1 2 3 4 5

5
1
2
3
4
5

输出

复制1 14 1050 73001 100955

1
14
1050
73001
100955

说明

n=2 的情况:(1*1*1)*(2*1*1+2*2*1+2*2*2) = 14

备注:

n≤10105n \leq 10^{10^5}n≤10105

保证输入总长度 ≤5×105\leq 5 \times 10^5≤5×105 且 T≤105T \leq 10^5T≤105

 


个人觉得唯一的难点在于刚开始的化简

关于这个怎么推出来的?我问了几个人,觉得目前能用的方法就是归纳,取n比较小的时候然后找规律去拆拆加加,当然数学好的当我没说。

如果出了这一步,那就预处理后面两个前缀,然后再处理一个连乘的sumi[i].

另外一个trick就是n很大,mod小,所以当n大于模数并且会枚举到mod的时候,后面的模数就都是0了(因为后面的都是模数的倍数)这个trick在多校里也有。

#include
#include
#include
#include
#include
#include
#include
#include
#include
#define debug(a) cout<<#a<<"="<>str+1;LL len=strlen(str+1); 
	if(len>6) cout<<0<=mod) cout<<0<>t;
  while(t--)
  {
  	solve();
  	
  }
return 0;
}

 

你可能感兴趣的:(思维,#,前缀和)