2013-03-17 2 views
-1

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

Вам просто нужно подсчитать количество упорядоченных троек разных чисел (X1, X2, X3), где Xi может быть любым положительным целым от 1 до Ni включительно (i = 1, 2, 3). Число N1, N2, N3 может быть до 10^18. Из-за этого ответ может быть довольно большим. Следовательно, вы должны выводить его по модулю 10^9 + 7.

Входной

Первая строка входного файла содержит целое число T, обозначающее количество тестов. Далее следует описание Т-тестов. Единственная строка каждого тестового примера содержит три целых числа N1, N2, N3, разделенные пробелами.

Выход

Для каждого теста вывести одну строку, содержащую количество требуемых троек по модулю 10^9 + 7.

Ограничения

1 ≤ T ≤ 1000

1 ≤ Ni ≤ 10^18

Example 

Input: 

5 

3 3 3 
2 4 2 
1 2 3 
25 12 2012 
1 1 2013 

Output: 
6 
4 
1 
578880 
0 

Это мое решение:

#include <iostream> 

using namespace std; 

int main() 
{ 
int t; 
scanf("%d",&t); 
for(int i=0; i<t; i++) 
{ 
    long long unsigned a,b,c,sum=0,s1,s2,s3; 
    scanf("%llu %llu %llu", &a,&b,&c); 
    for(s1=1; s1<=a; s1++) 
    { 
     for(s2=1; s2<=b; s2++) 
     { 
      if(s1==s2) continue; 
      for(s3=1; s3<=c; s3++) 
      { 
       if(s1==s3 || s2==s3) continue; 
       sum=(sum+1)%1000000007; 
      } 
     } 
    } 
    printf("%llu\n",sum); 
} 
return 0; 
} 
+0

это пахнет домашним заданием вопроса. почему вы хотите улучшить это? – bizzehdee

+0

Да, это домашнее задание. Это решение не может пройти через 2 секунды. – Mayhem

+1

Разве вы не должны просить своего профессора или ТП о помощи, а не обманывать домашнюю работу? –

ответ

1

Ну, я узнал, что вы можете рассчитать количество упорядоченных троек легко так вот решение:

#include <iostream> 
#include <algorithm> 

using namespace std; 

int main() 
{ 
const long long unsigned the_prime= 1000000007; 
int t; 
scanf("%d",&t); 
for(int i=0; i<t; i++) 
{ 
    long long unsigned m[3],res=0; 
    scanf("%llu %llu %llu", &m[0],&m[1],&m[2]); 
    sort(m,m+3); 
    res=((((m[0]%the_prime)*((m[1]-1)%the_prime))%the_prime)*((m[2]-2)%the_prime))%the_prime; 
    printf("%llu\n",res); 
} 
return 0; 
} 
+0

Ya его задача подсчета, n1 * (n2-1) * (n3-1), но это верно только тогда, когда n1 SGM1

Смежные вопросы