Lucky7(hdu5768)
生活随笔
收集整理的這篇文章主要介紹了
Lucky7(hdu5768)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Lucky7
Time Limit: 2000/1000 MS (Java/Others)????Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 328????Accepted Submission(s): 130
?? once wrote an autobiography, which mentioned something about himself. In his book, it said seven is his favorite number and he thinks that a number can be divisible by seven can bring him good luck. On the other hand, ?? abhors some other prime numbers and thinks a number x divided by pi which is one of these prime numbers with a given remainder ai will bring him bad luck. In this case, many of his lucky numbers are sullied because they can be divisible by 7 and also has a remainder of ai when it is divided by the prime number pi.
Now give you a pair of x and y, and N pairs of ai and pi, please find out how many numbers between x and y can bring ?? good luck.
?
Input On the first line there is an integer T(T≤20) representing the number of test cases.Each test case starts with three integers three intergers n, x, y(0<=n<=15,0<x<y<1018) on a line where n is the number of pirmes.?
Following on n lines each contains two integers pi, ai where pi is the pirme and ?? abhors the numbers have a remainder of ai when they are divided by pi.?
It is guranteed that all the pi are distinct and pi!=7.?
It is also guaranteed that p1*p2*…*pn<=1018?and 0<ai<pi<=105for every i∈(1…n).
?
Output For each test case, first output "Case #x: ",x=1,2,3...., then output the correct answer on a line.?
Sample Input 2 2 1 100 3 2 5 3 0 1 100?
Sample Output Case #1: 7 Case #2: 14 Hint For Case 1: 7,21,42,49,70,84,91 are the seven numbers. For Case2: 7,14,21,28,35,42,49,56,63,70,77,84,91,98 are the fourteen numbers.?
Author FZU 思路:中國剩余定理+容斥+擴展歐幾里得; 比賽時打了將近2個小時,最后還因為快速冪中的一個模沒寫而超時 GG啊。 其實題解的思路和我的思路有些不同,題解是容斥的時候將7加入一起用中國剩余定理求解,這時求出來的通解直接是7 的倍數,因為%7=0,加入求同余方程組的解; 因為只要符合模這些數中的一條就可以了,如果直接求解會重復,所以用容斥原理。加入其中求得一個通解,記為t+kmod; 然后y<=t+kmod<=x;移項可以求出k的解的個數,然后根據容斥這里是奇減偶加。 然后我的思路是沒有加入7求同余。 而是用求出那些個的數的同余方程組的解然后t+kmod=7r;再用擴展歐幾里得,求k的通解,但在這之前我先求x<=t+kmod<=y;的k的范圍。 擴歐求得的b+7p,代入前面的不等式解p的范圍,求得p有多少個,然后容斥奇減偶加p; 1 #include<stdio.h> 2 #include<algorithm> 3 #include<iostream> 4 #include<string.h> 5 #include<queue> 6 #include<stdlib.h> 7 #include<iostream> 8 #include<vector> 9 #include<map> 10 #include<set> 11 #include<math.h> 12 using namespace std; 13 typedef long long LL; 14 typedef struct pp 15 { 16 LL x; 17 LL y; 18 } ss; 19 ss ans[20]; 20 LL quick(LL n,LL m,LL mod); 21 LL mul(LL n, LL m,LL p); 22 pair<LL,LL>P(LL n,LL m); 23 LL gcd(LL n, LL m); 24 LL mm[20]; 25 int main(void) 26 { 27 int i,j,k; 28 scanf("%d",&k); 29 int __ca=0; 30 LL n,x,y; 31 while(k--) 32 { 33 __ca++; 34 scanf("%lld %lld %lld",&n,&x,&y); 35 LL sum; 36 sum=y/7-(x-1)/7; 37 printf("Case #%d: ",__ca); 38 if(n==0) 39 { 40 printf("%lld\n",sum); 41 } 42 else 43 { 44 LL mod=1; 45 for(i=0; i<n; i++) 46 { 47 scanf("%lld %lld",&ans[i].x,&ans[i].y); 48 } 49 LL anw=0; 50 int s; 51 for(j=1; j<(1<<n); j++) 52 { 53 int cr=0; 54 for(s=0; s<n; s++) 55 { 56 if(j&(1<<s)) 57 { 58 mm[cr++]=s; 59 } 60 } 61 LL mod=1; 62 LL acm=0; 63 for(i=0; i<cr; i++) 64 { 65 mod*=ans[mm[i]].x; 66 } 67 for(i=0; i<cr; i++) 68 { 69 LL mod1=mod/ans[mm[i]].x; 70 LL ni=quick(mod1,ans[mm[i]].x-2,ans[mm[i]].x); 71 acm=(acm+mul(mul(mod1,ni,mod),ans[mm[i]].y,mod))%mod; 72 } 73 anw=acm; 74 LL ctx=0; 75 if(anw>y) 76 { 77 continue; 78 } 79 else 80 { 81 LL cha=x-anw; 82 LL nx,ny; 83 LL cha1=y-anw; 84 nx=cha/mod; 85 while(anw+mod*nx<x) 86 { 87 nx++; 88 } if(cha<0)nx=0; 89 ny=cha1/mod; 90 { 91 pair<LL ,LL>AK=P(mod,7); 92 LL nxx=(AK.first*acm%7+7)%7; 93 nxx=((-nxx)%7+7)%7; 94 if(ny>=nxx) 95 { 96 LL cx=max(nx-nxx,(LL)0); 97 LL cy=ny-nxx; 98 if(cx==0)ctx=cy/7+1;else {ctx=cy/7-(cx-1)/7;} 99 } 100 } 101 } 102 if(cr%2) 103 { 104 sum-=ctx; 105 } 106 else sum+=ctx; 107 } printf("%lld\n",sum); 108 } 109 } 110 return 0; 111 } 112 LL gcd(LL n, LL m) 113 { 114 if(m==0) 115 { 116 return n; 117 } 118 else if(n%m==0) 119 { 120 return m; 121 } 122 else 123 { 124 return gcd(m,n%m); 125 } 126 } 127 LL quick(LL n,LL m,LL mod) 128 { 129 LL cnt=1;n%=mod; 130 while(m) 131 { 132 if(m&1) 133 { 134 cnt=cnt*n%mod; 135 } 136 n=n*n%mod; 137 m/=2; 138 } 139 return cnt; 140 } 141 LL mul(LL n, LL m,LL p) 142 { 143 n%=p; 144 m%=p; 145 LL ret=0; 146 while(m) 147 { 148 if(m&1) 149 { 150 ret=ret+n; 151 ret%=p; 152 } 153 m>>=1; 154 n<<=1; 155 n%=p; 156 } 157 return ret; 158 } 159 pair<LL,LL>P(LL n,LL m) 160 { 161 if(m==0) 162 { 163 pair<LL,LL>ak; 164 ak=make_pair(1,0); 165 return ak; 166 } 167 else 168 { 169 pair<LL,LL>A=P(m,n%m); 170 LL nx=A.second; 171 LL ny=A.first; 172 ny=ny-(n/m)*nx; 173 A.first=nx; 174 A.second=ny; 175 return A; 176 } 177 } 1 #include<stdio.h> 2 #include<algorithm> 3 #include<iostream> 4 #include<string.h> 5 #include<queue> 6 #include<stdlib.h> 7 #include<iostream> 8 #include<vector> 9 #include<map> 10 #include<set> 11 #include<math.h> 12 using namespace std; 13 typedef long long LL; 14 typedef struct pp 15 { 16 LL x; 17 LL y; 18 } ss; 19 ss ans[20]; 20 LL quick(LL n,LL m,LL mod); 21 LL mul(LL n, LL m,LL p); 22 pair<LL,LL>P(LL n,LL m); 23 LL gcd(LL n, LL m); 24 LL mm[20]; 25 int main(void) 26 { 27 int i,j,k; 28 scanf("%d",&k); 29 int __ca=0; 30 LL n,x,y; 31 while(k--) 32 { 33 __ca++; 34 scanf("%lld %lld %lld",&n,&x,&y); 35 LL sum; 36 sum=y/7-(x-1)/7; 37 if(n==0) 38 { 39 printf("Case #%d: %lld\n",__ca,sum); 40 } 41 else 42 { 43 LL mod=1; 44 for(i=0; i<n; i++) 45 { 46 scanf("%lld %lld",&ans[i].x,&ans[i].y); 47 } 48 LL anw=0; 49 LL s; 50 for(j=1; j<(1<<n); j++) 51 { LL mod=1; 52 int cr=0; 53 for(s=0; s<n; s++) 54 { 55 if(j&(1<<s)) 56 { 57 mm[cr++]=s; 58 mod*=ans[s].x; 59 } 60 }mod*=7; 61 LL acm=0; 62 for(i=0; i<cr; i++) 63 { 64 LL mod1=mod/ans[mm[i]].x; 65 LL ni=quick(mod1,ans[mm[i]].x-2,ans[mm[i]].x); 66 acm=(acm+mul(mul(mod1,ni,mod),ans[mm[i]].y,mod))%mod; 67 } 68 acm%=mod; 69 acm+=mod; 70 acm%=mod; 71 anw=acm; 72 LL ctx=0; 73 if(anw>y) 74 { 75 continue; 76 } 77 else 78 { 79 if(anw<x) 80 { 81 LL ax=x-anw-1; 82 LL ay=y-anw; 83 ctx+=ay/mod-ax/mod; 84 } 85 else if(anw>=x) 86 { LL ay=y-anw; 87 ctx+=ay/mod+1; 88 } 89 } 90 if(cr%2) 91 { 92 sum-=ctx; 93 } 94 else sum+=ctx; 95 } printf("Case #%d: %lld\n",__ca,sum); 96 } 97 } 98 return 0; 99 } 100 LL gcd(LL n, LL m) 101 { 102 if(m==0) 103 { 104 return n; 105 } 106 else if(n%m==0) 107 { 108 return m; 109 } 110 else 111 { 112 return gcd(m,n%m); 113 } 114 } 115 LL quick(LL n,LL m,LL mod) 116 { 117 LL cnt=1;n%=mod; 118 while(m>0) 119 { 120 if(m&1) 121 { 122 cnt=cnt*n%mod; 123 } 124 n=n*n%mod; 125 m/=2; 126 } 127 return cnt; 128 } 129 LL mul(LL n, LL m,LL p) 130 { 131 n%=p; 132 m%=p; 133 LL ret=0; 134 while(m) 135 { 136 if(m&1) 137 { 138 ret=ret+n; 139 ret%=p; 140 } 141 m>>=1; 142 n<<=1; 143 n%=p; 144 } 145 return ret; 146 } 147 pair<LL,LL>P(LL n,LL m) 148 { 149 if(m==0) 150 { 151 pair<LL,LL>ak; 152 ak=make_pair(1,0); 153 return ak; 154 } 155 else 156 { 157 pair<LL,LL>A=P(m,n%m); 158 LL nx=A.second; 159 LL ny=A.first; 160 ny=ny-(n/m)*nx; 161 A.first=nx; 162 A.second=ny; 163 return A; 164 } 165 }?
轉載于:https://www.cnblogs.com/zzuli2sjy/p/5716795.html
總結
以上是生活随笔為你收集整理的Lucky7(hdu5768)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python中统计列表各个元素的个数
- 下一篇: 阿里云直播PHP SDK如何使用