版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_38083668/article/details/82987253
T1:
矩阵快速幂+前缀和优化
代码:
#include <bits/stdc++.h>
using namespace std;
const int Max=100005;
int t,n,m,num[Max],sum;
char ch[Max];
inline int ksm(int a,int b,int mod)
{
int ans=1;
a%=mod;
while(b)
{
if(b&1) ans=(ans*a)%mod;
b>>=1;
a=(a*a)%mod;
}
return ans;
}
inline bool check()
{
sum=0;
for(int i=1;i<=n;i++)
if(ch[i]>='A') num[i]=(ch[i]-'A')+10;
else num[i]=ch[i]-'0';
for(int i=1;i<=n;i++)
sum=(sum+num[i]*ksm(m,n-i,m-1))%(m-1);
return !sum;
}
int main()
{
scanf("%d\n",&t);
while(t--)
{
scanf("%d%s",&m,ch+1);
n=strlen(ch+1);
if(check()) printf("yes\n");
else printf("no\n");
}
return 0;
}
T2:
折半搜索
代码:
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int Max=18000000;
int n,m,h1,h2,h,t,ans,maxx,tot1,tot2;
int num[50],p1[50],p2[50],ans1[Max],ans2[Max];
inline int get_int()
{
int x=0,f=1;
char c;
for(c=getchar();(!isdigit(c))&&(c!='-');c=getchar());
if(c=='-') f=-1,c=getchar();
for(;isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+c-'0';
return x*f;
}
inline void dfs(int num,int s,int t,int ans[],int p[])
{
ans[++h]=num;
for(int i=s;i<=t;i++)
{
int x=num;
while(x<=m/p[i])
{
dfs(x*p[i],i+1,t,ans,p);
x*=p[i];
}
}
}
signed main()
{
n=get_int(),m=get_int();
for(int i=1;i<=n;i++) num[i]=get_int();
for(int i=1;i<=n;i+=2) p1[++tot1]=num[i];
for(int i=2;i<=n;i+=2) p2[++tot2]=num[i];
dfs(1,1,tot1,ans1,p1),h1=h,h=0,dfs(1,1,tot2,ans2,p2),h2=h;
sort(ans1+1,ans1+h1+1),sort(ans2+1,ans2+h2+1),t=h2;
for(int i=1;i<=h1;i++)
{
while(ans1[i]*ans2[t]>m) t--;
ans+=t;
maxx=max(maxx,ans1[i]*ans2[t]);
}
cout<<maxx<<"\n"<<ans;
return 0;
}
T3:
平衡树
代码:
#include<bits/stdc++.h>
using namespace std;
inline int read(){
char ch=getchar();int i=0,f=1;
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch)){i=(i<<1)+(i<<3)+ch-'0';ch=getchar();}
return i*f;
}
inline void W(int x){
static int buf[50];
if(!x){putchar('0');return;}
if(x<0){putchar('-');x=-x;}
while(x)buf[++buf[0]]=x%10,x/=10;
while(buf[0])putchar(buf[buf[0]--]+'0');
}
const int Maxn=1e5+50;
int n,k;
struct node{
int mx[7],mn[7],sze;
friend inline bool operator <(const node &a,const node &b){
for(int i=0;i<k;i++)if(a.mn[i]<b.mx[i])return true;
return false;
}
friend inline bool operator >(const node &a,const node &b){
for(int i=0;i<k;i++)if(a.mx[i]>b.mn[i])return true;
return false;
}
};
set<node>S;
typedef set<node>::iterator it;
inline void insert(){
static node tmp;
tmp.sze=1;
for(int i=0;i<k;i++)tmp.mx[i]=tmp.mn[i]=read();
it t=S.lower_bound(tmp);
for(t=S.lower_bound(tmp);t!=S.begin();t=S.lower_bound(tmp)){
t--;
if((*t>tmp)){
for(int i=0;i<k;i++){
tmp.mx[i]=max(tmp.mx[i],t->mx[i]);
tmp.mn[i]=min(tmp.mn[i],t->mn[i]);
}
tmp.sze+=t->sze;
S.erase(t);
}
else break;
}
S.insert(tmp);
}
int main(){
n=read(),k=read();
for(int i=1;i<=n;i++){
insert();
W((*--S.end()).sze),putchar(' ');
}
}