标签:
题目列表:hdu5214~5223
5214:
当时第一反应是由递推公式推出通项公式,事实证明这就是作!大!死!
因为通项公式是这样的:L[n]=a^(n-1)*(b+L[1])-b
于是就需要快速幂。然而用了快速幂还是慢。。。【实际上是被卡在了7000ms多一点点。。。】
其实直接放到数组里一项一项递推就行。。速度并不慢还省事
另外本题还有一个point:被mod的那个数字很奇怪,所以直接用unsigned int存就行。不仅省空间还不用mod了(溢出相当于自动mod)
当时没想起来这个于是用了long long,于是数组存不下,于是T^T
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #define LL unsigned int 5 //#define MOD 4294967296 6 using namespace std; 7 LL N,L1,R1,a,b,c,d,T; 8 LL ll[10000010],rr[10000010]; 9 LL li,ri; 10 11 int main() 12 { 13 scanf("%d",&T); 14 while(T--) 15 { 16 scanf("%d%d%d%d%d%d%d",&N,&L1,&R1,&a,&b,&c,&d); 17 ll[1]=L1; rr[1]=R1; 18 if(L1>R1) swap(L1,R1); 19 LL minl=L1,minr=R1,maxl=L1,maxr=R1; 20 for(LL i=2;i<=N;i++) 21 { 22 ll[i]=ll[i-1]*a+b; 23 rr[i]=rr[i-1]*c+d; 24 li=ll[i],ri=rr[i]; 25 if(li>ri) swap(li,ri); 26 if (ri<minr) 27 { 28 minl=li; 29 minr=ri; 30 } 31 if (li>maxl) 32 { 33 maxl=li; 34 maxr=ri; 35 } 36 } 37 bool ok=false; 38 //cout<<minl<<","<<minr<<" "<<maxl<<","<<maxr<<endl; 39 for(LL i=1;i<=N;i++) 40 { 41 li=ll[i]; ri=rr[i]; 42 if(li>ri) swap(li,ri); 43 //cout<<li<<","<<ri<<endl; 44 if((li>minr)&&(ri<maxl)) 45 { 46 ok=true; 47 break; 48 } 49 } 50 if (ok) printf("YES\n"); else printf("NO\n"); 51 } 52 return 0; 53 }
5223:
这题当时交给队友了。。。。
题意:给出若干L,R,A,表示gcd(p[L],p[L+1],...,p[R])=A。要求解出原数组p[]
sol:首先来看几个有代表性的情况:
1 9 7 1 9 6 1 9 8 1 9 3 1 9 4 1 9 8 1 5 3
2 5 3 2 5 4 2 5 4 2 5 7 2 5 6 2 5 4 2 7 7
stupid stupid stupid stupid stupid ok ok
对所有的L,R,A,令p[i]=lcm(p[i],A)(L<=i<=R)。最后再验证一遍
其实最后验证的时候求区间的gcd可以用优化的方法(类似RMQ的那个)。本题数据小懒得用了= =
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 #define LL long long 6 7 LL p[1010]; //array 8 int L[1010],R[1010]; //Li,Ri 9 LL A[1010]; //Ansi 10 int T,N,Q; 11 12 LL gcd(LL a,LL b) //辗转相除法,返回gcd(a,b) 13 { 14 if (b==0) return a; 15 return gcd(b,a%b); 16 } 17 18 LL lcm(LL a,LL b) 19 { 20 LL t=gcd(a,b); 21 t=a*b/t; 22 return t; 23 } 24 25 LL ggcd(int l,int r) 26 { 27 LL aa=p[l]; 28 for(int i=l+1;i<=r;i++) 29 aa=gcd(aa,p[i]); 30 return aa; 31 } 32 33 LL llcm(int l,int r) 34 { 35 LL aa=p[l]; 36 for(int i=l+1;i<=r;i++) 37 aa=lcm(aa,p[i]); 38 return aa; 39 } 40 41 int main() 42 { 43 scanf("%d",&T); 44 while(T--) 45 { 46 scanf("%d%d",&N,&Q); 47 for(int i=0;i<=1000;i++)p[i]=1; 48 for(int i=1;i<=Q;i++) 49 { 50 scanf("%d%d%I64d",&L[i],&R[i],&A[i]); 51 //LL t=llcm(L[i],R[i]); 52 //t=lcm(t,A[i]); 53 for(int j=L[i];j<=R[i];j++) 54 p[j]=lcm(p[j],A[i]); 55 //p[j]=t; 56 } 57 bool ok=true; 58 for (int i=1;i<=Q;i++) 59 { 60 LL t=ggcd(L[i],R[i]); 61 // printf("%d,%d = %I64d\n",L[i],R[i],t); 62 if (t!=A[i]) ok=false; 63 } 64 // for(int i=1;i<=N;i++) 65 // printf("%d ",p[i]); 66 // printf("\n"); 67 if(ok) 68 { 69 for(int i=1;i<N;i++) 70 printf("%I64d ",p[i]); 71 printf("%I64d\n",p[N]); 72 } 73 else 74 printf("Stupid BrotherK!\n"); 75 } 76 return 0; 77 }
标签:
原文地址:http://www.cnblogs.com/pdev/p/4501231.html