前提・実現したいこと
ご覧いただきありがとうございます。
実行時間制限で解けなかった問題でどうしても解法が気になってしまったので、質問さしていただきます。
・10^18以下の数字l,r(l<r)が与えられており
・m個のばらばらの数字n1,n2...nmが与えられている
(n<10^8である)
この時l~rの数字の中で、
n1の倍数でもなく
n2の倍数でもなく
...
nmの倍数でもない
数字は何個あるでしょうか?
という問題です。
以下は自分が書いたコードです。
C++
1#include <bits/stdc++.h> 2using namespace std; 3 4int main() { 5 long long l,r; 6 7 cin >> l >> r; 8 long long numbers_number=r-l+1; 9 vector<bool> numbers(numbers_number); 10 fill(numbers.begin(), numbers.end(),true); 11 12 int m; 13 cin >> m; 14 vector<int> n(m); 15 for(int i=0; i<m ;i++){ 16 cin >> n.at(i); 17 } 18 19 for(int i=0; i<m ;i++){ 20 int N = n.at(i); 21 int j; 22 if(l%N){ 23 j=l/N+1; 24 } else 25 { 26 j=l/N; 27 } 28 while (true) 29 { 30 numbers.at(j*N-l)=false; 31 j++; 32 if(N*j>r)break; 33 } 34 } 35 36 long long result=0; 37 for(int i=0; i<numbers_number; i++){ 38 if(numbers.at(i)==true){ 39 result++; 40 } 41 } 42 43 cout << result; 44}
発生している問題・エラーメッセージ
この解法ですと、
・l~rの幅が広い場合
→bad_allocとなり配列が宣言できない
要素数が少ない場合だと大丈夫ですが、
要素数1000000000000ぐらいから作成できなくなりました。
・複雑な場合だと制限時間で答えられない
のでTLEになってしまいました。
どのようにすれば、制限時間内に解けるのでしょうか?
よろしければご教授頂きたいです。
補足
実行時間制限は2秒でしたが、この解法ではtimeout(7秒以上)でした
すみません制約が一つ抜けていました。
m個は10以下です。
回答2件
あなたの回答
tips
プレビュー