2 条题解
-
0
Solution
一、思考过程
无解情况:
即当修改下标 时,无解(输出 )。有解情况:
修改下标为 的元素时,以 的因数为下标的元素中必然会有至少一个被修改。设其中一个的下标为 ,同理则以 的因数为下标的元素中必然会有至少一个被修改。显然这是一个递归过程,而终止条件则是得到的某一个因数 为质数。那么贪心策略告诉我们,当 为质数,即 为 的质因数时,需要的修改次数是最少的。
但是,当以 为下标的元素被修改时,以 的倍数为下标的元素也必然会被修改。所以总的修改个数为 。又因为 越大,修改个数越小,所以我们得到 为 的最大质因数。二、复杂度分析
时间复杂度最大开销是寻找最大质因数的过程,我们可以用质因数分解解决,时间复杂度 。又因为有 次询问,所以总的时间复杂度 。瞄一眼数据范围,, , 最大 ,可以通过。
空间复杂度 。三、代码
#include <iostream> #define int long long //心里踏实 using namespace std; int n, q, x; signed main() { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); cin >> n >> q; while (q--) { cin >> x; if (x == 1) { cout << -1 << '\n'; continue; } int maxt = 0; for (int i = 2; i * i <= x; i++) { if (x % i == 0) maxt = i; while (x % i == 0) x /= i; } if (x != 1) maxt = x; cout << (n - maxt) / maxt << '\n'; } return 0; } -
-1
#include<bits/stdc++.h> using namespace std; const int N=1e4+10; int v[N],p[N],pr; void init() { for(int i=2;i<=N-10;i++) { if(!v[i])p[++pr]=i; for(int j=1;(j<=pr)&&(i*p[j]<=N-10);j++) { v[i*p[j]]=1; if(i%p[j]==0)break; } } } signed main() { init(); int n,q;cin>>n>>q; while(q--) { int x,ans=0;cin>>x; if(x==1){cout<<-1<<'\n';continue;} for(int i=1;i<=pr;i++) while(x%p[i]==0)ans=max(ans,p[i]),x/=p[i]; ans=max(ans,x); cout<<(n/ans-1)<<'\n'; } return 0; }
- 1
信息
- ID
- 7464
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 8
- 标签
- 递交数
- 13
- 已通过
- 6
- 上传者