La question est la suivante: étant donné deux nombres n et k. Pour chaque nombre de l'intervalle [1, n], votre tâche est de calculer son plus grand diviseur qui n'est pas divisible par k. Imprimez la somme de tous ces diviseurs. Remarque: k est toujours un nombre premier. t = 3 * 10 ^ 5,1 <= n <= 10 ^ 9, 2 <= k <= 10 ^ 9
Mon approche de la question: pour tout i compris entre 1 et n, le diviseur requis est i lui-même, uniquement lorsque ce i n'est pas un multiple de k. Si ce i est multiple de k, alors nous devons trouver le plus grand diviseur d'un nombre et faire correspondre avec k. Si cela ne correspond pas, alors ce diviseur est ma réponse. sinon, ma réponse est le deuxième plus grand diviseur.
par exemple, prenez n = 10 et k = 2, les diviseurs requis pour chaque i compris entre 1 et 10 sont 1, 1, 3, 1, 5, 3, 7, 1, 9, 5. la somme de ces diviseurs est de 36. Donc ans = 36.
Mon code, qui fonctionne pour quelques cas de test et a échoué pour certains.
#include<bits/stdc++.h>
using namespace std;
#define ll long long int
ll div2(ll n, ll k) {
if (n % k != 0 || n == 1) {
return n;
}
else {
for (int i = 2; i * i <= n; i++) {
if (n % i == 0) {
ll aa = n / i;
if (aa % k != 0) {
return aa;
}
}
}
}
return 1;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int t;
cin >> t;
while (t--) {
ll n, k;
cin >> n >> k;
ll sum = 0, pp;
for (pp = 1; pp <= n; pp++) {
//cout << div2(pp, k);
sum = sum + div2(pp, k);
}
cout << sum << '\n';
}
}
Quelqu'un peut-il m'aider là où je me trompe ou me suggérer une logique plus rapide pour répondre à cette question, car certains de mes cas de test indiquent que le TEMPS EST DÉPASSÉ
après avoir regardé toutes les explications possibles, je modifie mon code comme suit:
#include<bits/stdc++.h>
using namespace std;
#define ll long long int
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int t;
cin >> t;
while (t--) {
ll n, i;
ll k, sum;
cin >> n >> k;
sum = (n * (n + 1)) / 2;
for (i = k; i <= n; i = i + k) {
ll dmax = i / k;
while (dmax % k == 0) {
dmax = dmax / k;
}
sum = (sum - i) + dmax;
}
cout << sum << '\n';
}
}
Mais il donne toujours un délai de dépassement pour 3 cas de test. Quelqu'un s'il vous plaît aider.
Je me demande si quelque chose comme ça est ce que signifie One Lyner.
(Notez que ce code contient deux erreurs, qui sont décrites dans les commentaires, et peuvent être élucidées par le nouveau code de One Lyner.)
Code C++:
#include <vector>
#include <iostream>
using namespace std;
#define ll long long int
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int t;
cin >> t;
while (t--) {
ll n;
ll k, _k, result;
vector<ll> powers;
cin >> n >> k;
result = n * (n + 1) / 2;
_k = k;
while (_k <= n) {
powers.Push_back(_k);
_k = _k * k;
}
for (ll p : powers) {
ll num_js = n / p;
result -= num_js * (num_js + 1) / 2 * (p - 1);
int i = 0;
while (p * powers[i] <= n) {
result += powers[i] * (p - 1);
i = i + 1;
}
}
cout << result << '\n';
}
}