A:没看懂题,
我猜是转化二进制,然后去掉前导和后面的0,然后反过来,再转10进制输出。
B:没看懂题,出题人卡语文都是某种生物……QAQ
C:物理题:
可以三分模拟退火神马的
但是有O(1)公式。
推导过程在代码中:
/*
输入H,V
设Vx,Vy,t,S
Vx^2+Vy^2=V^2
4.9t*t-Vx*t=H
S=Vy*t
求maxS
*/
/* 输入H,V 设Vx,Vy,t,S Vx^2+Vy^2=V^2 4.9t*t-Vx*t=H S=Vy*t 求maxS */ #include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; int g; double V,H; int main() { // freopen("C.in","r",stdin); scanf("%d",&g); while(g--) { scanf("%lf%lf",&H,&V); printf("%.2lf\n",sqrt(((V*V+9.800*H)*(V*V+9.800*H)-96.04*H*H)/96.04000)); } return 0; }
式子:len!/(now[1]!*now[2]!*……*now[30000]!)
转移:
for(int i=1;i<=q;i++) { while(r<query[i].r) { ans*=(++len); ans%=mod; ans*=niyuan[(++now[src[++r]])]; ans%=mod; } while(r>query[i].r) { ans*=niyuan[(len--)]; ans%=mod; ans*=(now[src[r--]]--); ans%=mod; } while(l<query[i].l) { ans*=niyuan[(len--)]; ans%=mod; ans*=(now[src[l++]]--); ans%=mod; } while(l>query[i].l) { ans*=(++len); ans%=mod; ans*=niyuan[(++now[src[--l]])]; ans%=mod; } ret[query[i].note]=ans; }
代码:
#include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define N 30500 #define mod 1000000007 #define LL long long using namespace std; LL Ksm(int x,int y){ LL t=x,res=1;for(;y;y>>=1,t=(LL)t*t%mod)if(y&1)res=(LL)res*t%mod;return res; } LL Inv(int x){ if(!x)x=mod; return Ksm(x,mod-2); } LL niyuan[N]; void init() { for(int i=0;i<=30000;i++) { niyuan[i]=Inv(i); } } struct Q { int l,r,id,note; long long ret; }query[N]; int n,m,q,g,block; int src[N],cnt[N]; long long ans; int l,r,len; int now[N],ret[N]; int cmplr(Q a,Q b){if(a.l==b.l)return a.r<b.r;return a.l<b.l;} int cmpid(Q a,Q b){if(a.id==b.id)return a.r<b.r;return a.id<b.id;} int cmpno(Q a,Q b){return a.note<b.note;} void build() { int i,j,k; scanf("%d%d",&n,&q); for(i=1;i<=n;i++)scanf("%d",&src[i]); block=(int)sqrt(n); m=(n-1)/block+1; for(i=1;i<=q;i++)scanf("%d%d",&query[i].l,&query[i].r),query[i].note=i; sort(query+1,query+q+1,cmplr); int id=1; for(i=1;i<=q;i++) { while(id*block<=query[i].l)id++; query[i].id=id; } sort(query+1,query+q+1,cmpid); } void modui() { r=0,l=1;ans=1ll,len=0; memset(now,0,sizeof(now)); <span style="white-space:pre"> </span>for(int i=1;i<=q;i++) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>while(r<query[i].r) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>ans*=(++len); <span style="white-space:pre"> </span>ans%=mod; <span style="white-space:pre"> </span>ans*=niyuan[(++now[src[++r]])]; <span style="white-space:pre"> </span>ans%=mod; <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>while(r>query[i].r) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>ans*=niyuan[(len--)]; <span style="white-space:pre"> </span>ans%=mod; <span style="white-space:pre"> </span>ans*=(now[src[r--]]--); <span style="white-space:pre"> </span>ans%=mod; <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>while(l<query[i].l) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>ans*=niyuan[(len--)]; <span style="white-space:pre"> </span>ans%=mod; <span style="white-space:pre"> </span>ans*=(now[src[l++]]--); <span style="white-space:pre"> </span>ans%=mod; <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>while(l>query[i].l) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>ans*=(++len); <span style="white-space:pre"> </span>ans%=mod; <span style="white-space:pre"> </span>ans*=niyuan[(++now[src[--l]])]; <span style="white-space:pre"> </span>ans%=mod; <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>ret[query[i].note]=ans; <span style="white-space:pre"> </span>} int main() { // freopen("test.in","r",stdin); int i; scanf("%d",&g); init(); while(g--) { build(); modui(); for(i=1;i<=q;i++)printf("%d\n",ret[i]); } return 0; }
附一个样例:
input:
1
5 2
1 2 1 2 1
1 2
4 5
output:
2
2
那个,还没测完我就勇敢地发了题解。
有bug请请喷谢谢,但是思想都是对的。