Проблема 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; } }