代码改变世界

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 }