結果

問題 No.260 世界のなんとか3
ユーザー kyuridenamida
提出日時 2016-08-25 16:16:52
言語 C++11(廃止可能性あり)
(gcc 13.3.0)
結果
AC  
実行時間 163 ms / 2,000 ms
コード長 2,009 bytes
コンパイル時間 838 ms
コンパイル使用メモリ 98,716 KB
実行使用メモリ 8,448 KB
最終ジャッジ日時 2024-11-08 02:21:44
合計ジャッジ時間 4,002 ms
ジャッジサーバーID
(参考情報)
judge3 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 27
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <climits>
#include <cfloat>
#include <map>
#include <utility>
#include <ctime>
#include <set>
#include <iostream>
#include <memory>
#include <string>
#include <unordered_set>
#include <cstring>
#include <vector>
#include <algorithm>
#include <functional>
#include <fstream>
#include <sstream>
#include <complex>
#include <bitset>
#include <stack>
#include <queue>
#include <cstring>
#include <numeric>
#include <cassert>
using namespace std;
#define rep(i,n) for(int (i)=0;(i)<(n);(i)++)
#define rev(i,n) for(int i=(n)-1;(i)>=0;(i)--)
#define all(a) (a).begin(),(a).end()
#define pb(a) push_back(a)
#define bitcount(b) __builtin_popcount(b)
template<typename T, typename S> vector<T>& operator<<(vector<T>& a, S b) { a.push_back(b); return a; }
template<typename T> void operator>>(vector<T>& a, int b) {while(b--)if(!a.empty())a.pop_back();}
bool isprime(int n){ if(n<2)return false; for(int i=2;i*i<=n;i++)if(n%i==0)return false; return true;}
int MOD = 1e9+7;
string s;
int dp[10100][3][8][2][2];
long long dfs(int x,int mod3,int mod8,int lim,int three){
if( x == s.size() ) return (mod3 == 0 or three) and mod8 > 0;
if( dp[x][mod3][mod8][lim][three] != -1 ) return dp[x][mod3][mod8][lim][three];
int ans = 0;
for(int i = 0 ; i <= (lim?9:s[x]-'0') ; i++){
ans += dfs(x+1,(mod3*10+i)%3,(mod8*10+i)%8,lim||(i<s[x]-'0'),three||(i==3));
ans %= MOD;
}
return dp[x][mod3][mod8][lim][three] = ans % MOD;
}
long long f(string s_){
memset(dp,-1,sizeof(dp));
s = s_;
return dfs(0,0,0,0,0);
}
int is_sol(string s){
int mod3 = 0;
int mod8 = 0;
int three = 0;
for( auto c : s ) if( c == '3') three = 1;
for( auto c : s ) mod3 = (mod3*10+c-'0')%3;
for( auto c : s ) mod8 = (mod8*10+c-'0')%8;
return (three or mod3 == 0) and mod8 > 0;
}
int main(){
string A,B;
cin >> A >> B;
while( A.size() < B.size() ) A = "0" + A;
while( B.size() < A.size() ) B = "0" + B;
cout << ((f(B) - f(A) + is_sol(A))%MOD+MOD)%MOD << endl;
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0