%%%B哥
ZJ一下:
开题。
发现
语文考试????
我不认识XD。老帅哥救我!
后来……
对什么取模???
什么玩意??输入什么??
满足啥??
全是亻
啊!
后来才知道是题楔×了
不管了。
然后发现T1是慢速乘?
我以为是自然数幂和,结果不是。
就一个柿子。
T2想了半天……后来丢一个 set 乱搞。
T3打暴力,后来没调出来……
这是TJ:
T1
慢速乘(=快速加$Leftarrow$快速幂)
直接等差数列求和。
//sum #include <iostream> #include <cstring> #include <cstdio> #define LL long long using namespace std; LL lx,ly,rx,ry,mod; LL li,co; LL mul(LL a,LL b){ LL res=0; a%=mod; while(b){ if(b&1)res=(res+a)%mod; a=(a+a)%mod; b>>=1; } return res; } int main(){ #ifndef LOCAL freopen("sum.in" ,"r",stdin); freopen("sum.out","w",stdout); #endif cin>>lx>>ly>>rx>>ry>>mod; li=rx-lx+1; co=ry-ly+1; LL ans=0; if(co&1) ans=(ans+mul(mul((co+1)/2, co),li))%mod; else ans=(ans+mul(mul( co+1 ,co/2),li))%mod; if(li&1) ans=(ans+mul(mul((li-1)/2,li ),co))%mod; else ans=(ans+mul(mul( li-1 ,li/2),co))%mod; LL val=((lx%mod+ly%mod)%mod-2+mod)%mod; ans=(ans+mul(mul(li,co),val))%mod; cout<<ans<<endl; }
T2
倍增。
这个题是倍增思想的普适思路。
区间合法就先更新,然后将增量倍增。
区间非法就不更新,然后将增量减半。
#include <algorithm> #include <iostream> #include <cstring> #include <cstdio> #include <vector> #define N 555555 #define LL long long using namespace std; LL lim; int pn; LL bo[N],gi[N]; int ans=0; vector<LL>a,b; LL check(int l,int r){ a.clear(); b.clear(); for(int i=l;i<=r;i++){ a.push_back(bo[i]); b.push_back(gi[i]); } sort(a.begin(),a.end()); sort(b.begin(),b.end()); LL dat=0; for(int i=0;i<a.size();i++){ dat+=a[i]*b[i]; } // cout<<l<<" "<<r<<" "<<dat<<endl; return dat; } int main(){ #ifndef LOCAL freopen("pair.in" ,"r",stdin); freopen("pair.out","w",stdout); #endif cin.sync_with_stdio(false); cin>>pn>>lim; for(int i=1;i<=pn;i++) cin>>bo[i]; for(int i=1;i<=pn;i++) cin>>gi[i]; for(int i=1;i<=pn;){ int p=1,r=i; ans++; while(p!=0){ if(r+p<=pn&&check(i,r+p)<=lim){ r+=p; p*=2; } else p/=2; } i=r+1; } cout<<ans<<endl; }
T3
先口古