結果
| 問題 |
No.260 世界のなんとか3
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2020-03-30 17:10:29 |
| 言語 | Java (openjdk 23) |
| 結果 |
AC
|
| 実行時間 | 406 ms / 2,000 ms |
| コード長 | 1,711 bytes |
| コンパイル時間 | 2,370 ms |
| コンパイル使用メモリ | 78,528 KB |
| 実行使用メモリ | 60,044 KB |
| 最終ジャッジ日時 | 2024-09-27 09:23:22 |
| 合計ジャッジ時間 | 11,600 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 27 |
ソースコード
import java.util.Arrays;
import java.util.Scanner;
class Main {
public static void main(String[] args) {
new Main().run();
}
final long MOD=(long)1e9+7;
long ADD(long...a) {
long ret=0;
for(long v:a)ret=(ret+v)%MOD;
return ret;
}
int[] f(char[] a) {
int[] ret=new int[a.length];
for(int i=0;i<a.length;++i)ret[i]=(int)(a[i]-'0');
return ret;
}
long solve(int[] a) {
int n=a.length;
long[][][][][] dp=new long[2][2][2][3][8];// eq,3,mod3,mod8
dp[0][1][0][0][0]=1;
for(int i=0;i<n;++i) {
for(int eq=0;eq<=1;++eq) {
for(int e3=0;e3<=1;++e3) {
for(int m3=0;m3<3;++m3) {
for(int m8=0;m8<8;++m8) {
if(dp[i%2][eq][e3][m3][m8]==0)continue;
for(int v=0;v<=(eq==1?a[i]:9);++v) {
int neq=eq&(v==a[i]?1:0);
int ne3=e3|(v==3?1:0);
int nm3=(m3+v)%3;
int nm8=(m8*10+v)%8;
int ni=(i+1)%2;
dp[ni][neq][ne3][nm3][nm8]=ADD(dp[ni][neq][ne3][nm3][nm8],dp[i%2][eq][e3][m3][m8]);
}
}
}
}
}
dp[i%2]=new long[2][2][3][8];
}
long ret=0;
for(int eq=0;eq<=1;++eq) {
for(int e3=0;e3<=1;++e3) {
for(int m3=0;m3<3;++m3) {
for(int m8=1;m8<8;++m8) {
if(m3!=0&&e3!=1)continue;
ret=ADD(ret,dp[n%2][eq][e3][m3][m8]);
}
}
}
}
return ret;
}
void run() {
Scanner sc=new Scanner(System.in);
int[] a=f(sc.next().toCharArray());
int[] b=f(sc.next().toCharArray());
int carry=-1;
for(int i=a.length-1;i>=0;--i) {
a[i]+=carry;
carry=0;
if(a[i]<0) {
a[i]+=10;
carry=-1;
}
}
System.out.println((solve(b)-solve(a)+MOD)%MOD);
}
static void tr(Object... objects) {
System.out.println(Arrays.deepToString(objects));
}
}