小A要发布一个视频展现他优秀的球技,视频有n帧,小A有m个粉丝,如果同时有两个以上的粉丝看到他秀球技的一帧,该视频就会被广为传播,导致所有的粉丝发疯。每个粉丝会在y = k * ai + ri 时刻看视频,k为整数,问在保证粉丝不发疯的情况下小A可以在多少帧里炫技?
0 < a <= 100,0 <= r < a,1 <= n,m <=1e5
仔细观察数据量,可以遍历每一帧,再遍历每一个ai(ai范围较小),因为对于确定的帧数和确定的ai,余数确定,只需要看此ai及求出的余数的组合是否出现及出现的次数,加上出现的次数即可。(一开始以为要用线段树等数据结构,关键在于从ai的角度数据范围可以暴力)
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
int N, M;
int vis[110];
int cnt[maxn];
int main()
{
cin >> N >> M;
int a, r;
for(int i = 0; i < M; i++)
{
cin >> a >> r;
vis[a] = 1;
occur[a][r]++;
}
for(int i = 0; i < N; i++)
{
for(int j = 1; j <= 100; j++)
{
if(vis[j])
{
int t = i % j;
if(occur[j][t]) cnt[i] += occur[j][t]; //
}
}
}
int ans = 0;
for(int i = 0; i < N; i++)
{
if(cnt[i] <= 2) ans++;
}
cout << ans << endl;
return 0;
}