原题链接
题意:每次可以删除一个a[i] % (i + 1) 不等于0的数,问我们能否删完。
思路:首先思考其他元素删除带给当前元素的影响是什么,我们可以从i=1开始想,当i=1时,没有元素可以让下标为1的元素向左偏移;i=2时,仅有i=1的元素消除可以使得当前元素产生偏移…那么假设当前下标为i,我们可以通过消除前面的元素让自身的下标变成1~i-1,这都是可以取到的。因此我们有了初步的想法:暴力枚举每个数是否可以被2~i + 1整除。
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <math.h>
#include <map>
#include <set>
#include <queue>
using namespace std;
#define endl '\n'
const int maxn = 1e5 + 5;
int a[maxn],n;
void solve(){
cin >> n;
for (int i = 1; i <= n; ++i) {
cin >> a[i];
}
for (int i = 1; i <= n; ++i) {
int flag = 0;
for (int j = i; j >= 1; --j) {
if (a[i] % (j + 1)){
flag = 1;
break;
}
}
if (!flag){
cout << "NO" << endl;
return;
}
}
cout << "YES" << endl;
}
signed main(){
std::ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int t;
cin >> t;
while (t--) solve();
}
后来再次考虑1e9以内的数分解质因子后的因子也非常少,因此我们可以直接枚举,虽然表面是n2,但其实是很快的,这里第二层循环正序倒序都可以。