結果
問題 | No.260 世界のなんとか3 |
ユーザー |
![]() |
提出日時 | 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 |
ソースコード
#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;}