fork download
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cmath>
  4. #include <cstring>
  5. #define lli long long int
  6. #define MOD 1000000007
  7. using namespace std;
  8.  
  9. lli power(lli a, lli b)
  10. {
  11. if (b == 0)
  12. return 1;
  13. if (b == 1)
  14. return a;
  15. else {
  16. lli temp;
  17.  
  18. temp = power(a,b/2);
  19.  
  20. temp = (temp * temp) % MOD;
  21.  
  22. if (b & 1)
  23. return((temp * a) % MOD);
  24. else
  25. return temp;
  26. }
  27. }
  28.  
  29. int main() {
  30. // your code goes here
  31. lli tcase,d,n,i,j,k,max,min,ans,alop,temp;
  32.  
  33. scanf("%lld", &tcase);
  34.  
  35. while (tcase--) {
  36. scanf("%lld", &n);
  37.  
  38. lli a[n+1], s[101];
  39. ans = 0;
  40. max = 0;
  41.  
  42. for (i = 1; i <= n; ++i) {
  43. scanf("%lld", &a[i]);
  44. if (a[i] > max)
  45. max = a[i];
  46. if (i == 1)
  47. min = a[i];
  48. else if (a[i] < min)
  49. min = a[i];
  50. }
  51.  
  52. ans = 0;
  53.  
  54. for (d = min-max; d <= max-min; ++d) {
  55. memset(s, 0, sizeof(s));
  56. temp = 0;
  57.  
  58. for (i = 1; i <=n; ++i) {
  59. alop = 0;
  60. if (a[i] -d >= min && a[i]-d <= max)
  61. alop = s[a[i]-d];
  62. ++alop;
  63. s[a[i]] = (s[a[i]] + alop%MOD)%MOD;
  64. temp = (temp + alop%MOD)%MOD;
  65. }
  66.  
  67. temp = temp-n;
  68. ans = (ans + temp) % MOD;
  69.  
  70. }
  71. ans = (ans + n%MOD)%MOD;
  72. ans = ((lli)power(2,n) % MOD)-1-ans;
  73. printf("%lld\n", ans);
  74. }
  75.  
  76. return 0;
  77. }
Success #stdin #stdout 0s 2732KB
stdin
1 100 23 21 32 4 54 65 2 2 1 5 6 77 77 54 1 3 6 97 95 22 44 63 23 21 32 4 54 65 2 2 1 5 6 77 77 54 1 3 6 97 95 22 44 63 34 54 12 54 88 68 23 21 32 4 54 65 2 2 1 5 6 77 77 54 1 3 6 97 95 22 44 63 23 21 32 4 54 65 2 2 1 5 6 77 77 54 1 3 6 97 95 22 44 63 34 54 12 54 88 68
stdout
976360319