Kohila G Ответов: 2

Проблема totient Эйлера - не все прохождения тестов


давайте определим F(n) следующим образом ,
F(n)= количество чисел от 1 до max(1,n-1), которые являются взаимно простыми с n .
Вам будут даны T запросов , в каждом запросе вам будут даны два числа x,y .
Ваша задача-найти F(x)+F(x+1)+.....+F(y-1)+F(y) и выведите его в новой строке .

входной формат

Первая строка содержит T , указывающее количество запросов, каждая из следующих T строк содержит два числа x,y .

Ограничения

1<= T <= 100000
1 <= X <= Y <= 100000

выходной формат

Для каждого запроса выведите ответ в новой строке .

Образец Входного 0

2
2 5
6 10
Пример Результата 0

9
22
Пояснение 0

для 1-го запроса
F(2) = 1 ( только 1 является сопространством с 2)
F(3) = 2 ( 1,2 является сопространством с 2 )
F(4) = 2 ( 1,3 - сопространство с 4 )
F(5) = 4 ( 1,2,3,4 является сопространством с 5 )
1+2+2+4 = 9

Вот в чем вопрос. Образец тестовых случаев пройден. Я попробовал несколько пользовательских тестов. Снова прошел, однако не могу понять, почему все остальные тестовые случаи не проходят. Меня увольняют из-за ошибки тайм-аута. Я тоже не могу просмотреть тестовые случаи. Так что я действительно должен понять,почему это происходит. Логика правильная, и она работает. Но не все тестовые случаи не проходят.

Что я уже пробовал:

#include<iostream>
#include<bits/stdc++.h>
#include<cmath>
using namespace std;
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        int X,Y;
        float total= 0;
        cin>>X;
        cin>>Y;
        for(int i=X;i<=Y;i++)
        {
            int temp = i,mark =0;;
            float m =1,count=0;
            while(temp%2 == 0){
                mark = 1;
                temp=temp/2;
            }
            float FF =2;
            if(mark)
                    m *= 1-(1/FF);
            for(int j=3;j<=sqrt(temp);j=j+2)
            {
                 mark =0;
                while(temp%j==0){
                    mark = 1;
                    temp=temp/j;}
                float FF;
                FF = (float)j;           
                if(mark){
                    m *= 1-(1/FF); 
                }
            }
            if(temp>2)
            {
                float FF;
                FF = (float)temp;           
                m *= 1-(1/FF);
            }
            count = i*m;
            total += count;
        }
         long int kira = ( long int)total;
        cout<<kira<<endl;      
    }
}

2 Ответов

Рейтинг:
2

Thomas Daniels

Цитата:
Меня увольняют из-за ошибки тайм-аута

Это означает, что платформа прервала тестовый запуск, потому что ваш код слишком долго вычислял результаты. Другими словами, это слишком медленно. И если есть такие временные ограничения, то правильная логика-это не единственное, что имеет значение.

Я не знаю, сколько времени ваш код может потратить на это, но вы знаете, каковы наихудшие входные значения (потому что они даны в разделе "Ограничения").

Итак, попробуйте запустить свой код на худших входах, посмотрите, сколько времени это займет, и измените свой алгоритм, чтобы он быстрее обрабатывал эти входы. Как вы это сделаете, зависит только от вас - в конце концов, пребывание в условиях временных ограничений является частью задачи!


Kohila G

Я тоже попробовал худший вариант в пользовательском тестовом примере

Рейтинг:
14

Patrice T

Цитата:
Меня увольняют из-за ошибки тайм-аута. Я тоже не могу просмотреть тестовые случаи. Так что я действительно должен понять,почему это происходит.

Сообщение об ошибке означает, что программа занимает слишком много времени для завершения тестов.
Вам нужно сделать вашу программу быстрее.
Запоминание может сделать трюк: Мемуаризация - Википедия[^]


Kohila G

Спасибо.