Sicily/1195. Summation
2011-08-20 23:27 Min·zc 阅读(163) 评论(0) 编辑 收藏 举报对于输入的数据区间【a,b】,首先计算从0到a-1的和,然后在计算从0到b的和,之后将两个和想减就可以
在计算区间和的时候,计算没歌数字在各位出现的次数,然后分别计算出每一位的结果就可以
1 #include <iostream>
2 #include <memory.h>3 using namespace std;
4 int n,m;
5 void cal(long long x,int a[50],int& ilen)
6 {
7 int ans[50][50];
8 memset(ans,0,sizeof(ans));
9 for(int i=0;i<50;i++)
10 a[i]=0;
11 long long power[36];
12 int tem[50];
13 power[0]=1;
14 for(int i=1;i<35;i++)
15 power[i]=power[i-1]*m;
16 int len=0;
17 long long tx=x;
18 while(tx)
19 {
20 tem[len++]=tx%m;
21 tx/=m;
22 }
23 ilen=len;
24 for(int i=len-1;i>-1;i--)
25 {
26 if(i!=0)
27 for(int j=0;j<m;j++)
28 for(int k=0;k<i;k++)
29 {
30 ans[k][j]+=(power[i-1]*tem[i]);
31 ans[k][j]%=m;
32 }
33 ans[i][tem[i]]+=(x%power[i]+1);
34 ans[i][tem[i]]%=m;
35 for(int j=0;j<tem[i];j++)
36 {
37 ans[i][j]+=power[i];
38 ans[i][j]%=m;
39 }
40 }
41 for(int i=0;i<len;i++)
42 for(int j=0;j<m;j++)
43 {
44 a[i]+=(j*ans[i][j]);
45 a[i]%=m;
46 }
47
48 }
49
50 int main()
51 {
52 int t;
53 cin>>t;
54 while(t--)
55 {
56 cin>>n>>m;
57 int ans[50];
58 int len=0;
59 memset(ans,0,sizeof(ans));
60 long long sum=0;
61 for(int i=0;i<n;i++)
62 {
63 int a[50];
64 int b[50];
65 long long x,y;
66 cin>>x>>y;
67 int xlen;
68 int ylen;
69 cal(x-1,a,xlen);
70 cal(y,b,ylen);
71 if(len<ylen)
72 len=ylen;
73 if(xlen>len)
74 len=xlen;
75 for(int i=0;i<len;i++)
76 {
77 ans[i]+=(b[i]+m-a[i]);
78 ans[i]%=m;
79 }
80 }
81 for(int i=len-1;i>=0;i--)
82 {
83 sum*=m;
84 sum+=ans[i];
85 }
86 cout<<sum<<endl;
87 }
88 }