AOJ 2326
Number Sorting. 辞書順は小数にするとそのままソートできて楽です。
後はBITでDPするだけなので何も言うことはない。
#include<stdio.h> #include<algorithm> using namespace std; int mod; pair<double,int> v[131072]; int bit[131072]; int sum(int a,int b){ if(a==0){ int ret=0; for(b;b>=0;b=(b&(b+1))-1)ret=(ret+bit[b])%mod; return ret; }return (sum(0,b)-sum(0,a-1)+mod)%mod; } void add(int a,int b){ for(;a<131072;a|=a+1)bit[a]=(bit[a]+b)%mod; } int main(){ int a,b,c; while(scanf("%d%d%d",&a,&b,&c),c){ mod=c; b++; for(int i=a;i<b;i++){ double now=(double)i; int keta=-1; int t=i; while(t){ now*=0.1; keta++; t/=10; } now+=keta*(1e-11); v[i-a]=make_pair(now,i-a); } std::sort(v,v+b-a); for(int i=0;i<131072;i++)bit[i]=0; for(int i=0;i<b-a;i++){ add(v[i].second,sum(0,v[i].second)+1); } printf("%d\n",sum(0,131071)); } }