题目
hdu6754
规律题
#include <iostream>
#include <cstdio>
using namespace std;
const int mod=998244353;
/*int fastpow(int a,int n)
{
int res=1;
int temp=a;
while(n)
{
if(n&1)
{
res=(1ll*res*temp)%mod;
}
temp=(1ll*temp*temp)%mod;
n>>=1;
}
return res;
}*/
int main()
{
int t;
int n;
for(scanf("%d",&t);t--;)
{
scanf("%d",&n);
if(n==1)
printf("26\n");
else if(n==2)
printf("676\n");
else if(n==3)
printf("17576\n");
else
printf("15600\n");
//printf("%d\n",fastpow(26,n));
}
return 0;
}
hdu 6754
题目
题意 :
就是f[0]=0,f[1]=1;
f[i]=f[i-1]+f[i-2]
求(f0)k+ (fc)k+(f2c)k+(f3c)k…(fnc)k
mod 为1e9+9
斐波那契
费马定理
p 是一个质数
a^(p-1)mod p=1 mod p
a^(p-2)mod p=1/a mod p
#include <iostream>
using namespace std;
typedef long long ll;
const ll D=691504012;//1/A;
const ll C=276601605;//1/D;
const ll B=308495997;//(1-D)/2;
const ll A=691504013;//(1+D)/2;
const int mod=1e9+9;
ll n,c,k;
ll fast_pow(int a,ll n)
{
ll res=1;
ll temp=a;
while(n)
{
if(n&1)
{
res=res*temp%mod;
}
temp=temp*temp%mod;
n>>=1;
}
return res%mod;
}
const int kk=1e5+5;
ll inv[kk];
ll fact[kk];
ll invfact[kk];
void getinv(ll mod)
{
inv[1]=1;
for(int i=2;i<kk;i++)
inv[i]=(mod-mod/i)*inv[mod%i]%mod;
}
void init()
{
fact[0]=1;
invfact[0]=1;
for(int i=1;i<kk;i++)
{
fact[i]=fact[i-1]*i%mod;
invfact[i]=invfact[i-1]*inv[i]%mod;
}
}
ll getC(int m,int n)
{
if(m<0||m>n)
return -1;
return fact[n]*invfact[m]%mod*invfact[n-m]%mod;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
getinv(mod);
init();
int T;
cin>>T;
while(T--)
{
cin>>n>>c>>k;
ll DD=fast_pow(C,k);
ll Ac=fast_pow(A,c%(mod-1));
ll Bc=fast_pow(B,c%(mod-1));
ll Dc=fast_pow(D,c%(mod-1));
ll Ak=fast_pow(Ac,k);
ll res=0;
ll ans=0;
ll di;
ll fen;
ll a1=Ak;
ll temp=Dc*Bc%mod;
ll cki;
for(int i=0;i<=k;i++)
{
cki=getC(i,k)%mod;
if(i%2!=0)
{
cki=(mod-cki)%mod;
}
if(i!=0)
a1=a1*temp%mod;
if(a1==1)
{
res=(res+n%mod*cki%mod)%mod;
continue;
}
di=fast_pow((1+mod-a1)%mod,mod-2);
fen=fast_pow(a1,n%(mod-1));
fen=(1+mod-fen)%mod;
fen=fen*a1%mod;
ans=fen*di%mod;
ans=ans*cki%mod;
res=(res+ans)%mod;
}
res=res*DD%mod;
cout<<res<<"\n";
}
return 0;
}
hdu6759
题目
先按p 再按 a 排序
把后面a比前面小的删掉不可能第一
然后把1 2 放入集合 如果后面的能 比 前面一个赶上前面前面一个前赶上前面一个
那么前面一个下班 ,后面一个再跟前面继续比较,直到不行或者前面只有一个那么直接放进去
还有把一开始p a都相同的标记一下,也就是说永远都不可能第一
然后在集合里计数(没有被标记的)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef struct node
{
int p,a;
int flag;
operator < (const node &b)
{
if(p!=b.p)
return p>b.p;
return a>b.a;
}
}node;
node no[50005];
vector<node> vv;
vector<node> uu;
int res;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
int T;
cin>>T;
while(T--)
{
vv.clear();
uu.clear();
res=0;
int n;
cin>>n;
if(n==1)
{
int x,y;
cin>>x,y;
cout<<"1"<<"\n";
continue;
}
for(int i=0;i<n;i++)
{
cin>>no[i].p>>no[i].a;
no[i].flag=0;
}
sort(no,no+n);
for(int i=1;i<n;i++)
{
if(no[i].p==no[i-1].p&&no[i].a==no[i-1].a)
{
no[i-1].flag=no[i].flag=1;
}
}
vv.push_back(no[0]);
for(int i=1;i<n;i++)
{
node bb=vv[vv.size()-1];
if(no[i].a>bb.a)
{
vv.push_back(no[i]);
}
}
if(vv.size()<=1)
{
if(vv[0].flag==0)
cout<<"1"<<"\n";
else
cout<<"0"<<"\n";
continue;
}
uu.push_back(vv[0]);
uu.push_back(vv[1]);
for(int i=2;i<vv.size();i++)
{
node aa,bb;
node cc=vv[i];
while(true)
{
if(uu.size()==1)
break;
aa=uu[uu.size()-2];
bb=uu[uu.size()-1];
ll t1=1ll*(aa.p-bb.p)*(cc.a-bb.a);
ll t2=1ll*(bb.p-cc.p)*(bb.a-aa.a);
if(t2<=t1)
{
uu.pop_back();
}
else
break;
}
uu.push_back(cc);
}
for(int i=0;i<uu.size();i++)
{
if(uu[i].flag==0)
{
res++;
}
}
cout<<res<<"\n";
}
return 0;
}
hdu6756
题目
分块更新
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int Bigsize;
int a[maxn];
int du[maxn];
struct node
{
int v,next;
};
node no[maxn*10];
int head[maxn];
int cnt;
vector <int> re[maxn];
vector <int> to[maxn];
vector <pair<int ,int > > dis[maxn];
void add(int x,int y)
{
no[cnt].v=y;
no[cnt].next=head[x];
head[x]=cnt;
cnt++;
}
void insert_(int u,int x)
{
if(x>=du[u])
x=du[u];
re[u][x]++;
if(re[u][x]==1)
{
to[u][x/Bigsize]++;
}
}
void delete_(int u,int x)
{
if(x>=du[u])
x=du[u];
re[u][x]--;
if(re[u][x]==0)
{
to[u][x/Bigsize]--;
}
}
int query(int u)
{
int j;
for(int i=0;i<=du[u]/Bigsize;i++)
{
if(to[u][i]!=Bigsize)
{
j=i*Bigsize;
break;
}
}
for(int i=0;i<Bigsize;i++)
{
if(!re[u][i+j])
{
j=i+j;
break;
}
}
return j;
}
/*int query(int u)
{
for(int i=0;i<=du[u];i++)
{
if(to[u][i/Bigsize]==Bigsize)
{
i=i+Bigsize-1;
continue;
}
for(int j=0;j<Bigsize;j++)
{
if(re[u][i+j]==0)
{
return i+j;
}
}
}
}*/
int main()
{
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
int T;
cin>>T;
while(T--)
{
cnt=1;
int n,m;
cin>>n>>m;
Bigsize=sqrt(n);
for(int i=1;i<=n;i++)
{
re[i].clear();
to[i].clear();
dis[i].clear();
head[i]=0;
cin>>a[i];
}
for(int i=1;i<=m;i++)
{
int a,b;
cin>>a>>b;
du[a]++;
du[b]++;
add(a,b);
add(b,a);
}
for(int i=1;i<=n;i++)
{
re[i].resize(du[i]+5);
to[i].resize(du[i]/Bigsize+5);
}
for(int i=1;i<=n;i++)
{
for(int j=head[i];j;j=no[j].next)
{
int v=no[j].v;
insert_(i,a[v]);
if(du[v]>Bigsize)
{
dis[i].push_back({v,a[v]});
}
}
}
int q;
cin>>q;
for(int i=1;i<=q;i++)
{
int op;
cin>>op;
if(op==1)
{
int x, y;
cin>>x>>y;
if(du[x]>Bigsize)
{
a[x]=y;
}
else
{
for(int j=head[x];j;j=no[j].next)
{
int v=no[j].v;
delete_(v,a[x]);
insert_(v,y);
}
a[x]=y;
}
}
else
{
int x;
cin>>x;
for(int j=0;j<dis[x].size();j++)
{
int v=dis[x][j].first;
int w=dis[x][j].second;
if(w==a[v])
continue;
delete_(x,w);
insert_(x,a[v]);
dis[x][j].second=a[v];
}
cout<<query(x)<<"\n";
}
}
}
return 0;
}