1. 问题描述
2. 问题分析
- 可以使用双重循环来计算,但会超时!
- 需要将其转为数学问题,然后再进行等价转换才可以
- 下面是对Ai 使用300的倍数来进行表示,这个思路要记住,适用于倍数,求余有关的问题
- 最后一行作为是300倍数的关键,接下来只要满足这个等式的,num++
- 为了减少重复计算Ai%300 使用一个数组记录cnt记录下来即可
3. 代码
#include <iostream>
#include <vector>
#include<algorithm>
#include <iterator>
using namespace std;
int main()
{
// 思路:需要首先进行数学转换
int n;
scanf("%d",&n);
int cnt[300] = {0};
int num = 0;
int temp;
for(int i=0;i<n;i++)
{
scanf("%d",&temp);
num+= cnt[temp%300];
cnt[temp%300]++;
}
printf("%d",num);
return 0;
}
4. 总结与提升
- 关键在数学转换上,记住Ai表示思路