Wannafly挑战赛5 A.珂朵莉与宇宙

一时失言乱红尘 2022-06-02 02:16 307阅读 0赞
  1. Wannafly挑战赛5 A.珂朵莉与宇宙 题目描述
  2. 星神是来自宇宙的
  3. 所以珂朵莉也是吧
  4. 所以我就出了个题
  5. 给你一个长为n的序列a,有n*(n+1)/2个子区间,问这些子区间里面和为完全平方数的子区间个数
  6. 输入描述:
  7. 第一行一个数n
  8. 第二行n个数表示序列a
  9. 输出描述:
  10. 输出一个数表示答案
  11. 示例1
  12. 输入
  13. 6
  14. 0 1 0 9 1 0
  15. #include<cstdio>
  16. using namespace std;
  17. int sum[100010];
  18. int a[1000100];
  19. int main ()
  20. {
  21. int n;
  22. long long ans=0;
  23. scanf("%d",&n);
  24. for(int i=1;i<=n;i++){
  25. scanf("%d",&sum[i]);
  26. sum[i]+=sum[i-1];
  27. //a[sum[i]]++;先把a数组算出来是不对的
  28. }
  29. /*分为两种情况:
  30. 1是第一个数是完全平方数
  31. 2是第一个数不是完全平方数
  32. 所以a[0]=1就是为了处理第一种情况的
  33. 如果是第二种情况就没必要让a[0]=1了*/
  34. a[0]=1;
  35. for(int i=1;i<=n;i++){
  36. for(int j=0;j*j<=sum[i];j++){
  37. ans+=a[sum[i]-j*j];
  38. }
  39. //a[sum[i]]++表示某个前缀和出现的次数,且不能先把a数组给算出来,
  40. a[sum[i]]++;
  41. }
  42. printf("%lld\n", ans);
  43. return 0;
  44. }
  45. 前缀和a[j]肯定是大于等于可能满足的平方数的,所以前面用求得的n个前缀和 依次去 减去 一个平方数 得到的数 就是要截去的数目(也即一个前缀和),因为区间是连续的,所以只能是减掉某一个前缀和,所以就转化成求某些前缀和的总个数了
  46. 由题意也可得:sum[m] - sum[n] = j * j ,并且 m>=n
  47. j 就是那个平方数 ,并且 j 闭区间[nm] 内。由此可以看出求 j 的个数 就等价于就 sum[n] 的个数了 ( 有点逆向思维的味道)
  48. 
  49. 

发表评论

表情:
评论列表 (有 0 条评论,307人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Wannafly 挑战赛5

    A 题: 星神是来自宇宙的 所以珂朵莉也是吧 所以我就出了个题 给你一个长为n的序列a,有n\(n+1)/2个子区间,问这些子区间里面和为完全平方数的子区间个数 in

    相关 Wannafly挑战赛9

    A 题目描述 给定n个正整数,请找出其中有多少个数x满足:在这n个数中存在数y=kx,其中k为大于1的整数 输入描述: 第一行输入一个n