好累qwq,今天好生颓废
明天开坑:树剖复习,AC自动机
P2818 天使的起誓
就是给你好大好大的一个数然后取模,问等于几
#include <iostream>
using namespace std;
int main()
{
long long ans=0,n;
string s;
cin>>n>>s;
for(int i=0;i<s.length();i++)
{
ans=ans*10+s[i]-'0';
ans%=n;
}
if(ans)
cout<<ans<<endl;
else
cout<<n<<endl;
return 0;
}
当然题目很简单,但是这其实让我想起了这样一些题
1.I - Fibonacci in the Pocket
是关于对于个很大很大的数取模于3的
关于好大好大的数这样的东西,我又想起了欧拉降幂
2.大数乘法
就是个板子,你不理解欧拉降幂也无所谓
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e5+10;
ll phi(ll x)
{
ll ans=x;
for(ll i=2;i*i<=x;i++)
{
if(x%i==0)
{
ans-=ans/i;
while(x%i==0)
x/=i;
}
}
if(x>1)
ans-=ans/x;
return
ans;
}
ll q_pow(ll x,ll y,ll p)
{
if(y==0)
return 1ll;
ll ans=1ll;
while(y)
{
if(y&1)
ans=ans*x%p;
x=x*x%p;
y>>=1;
}
return ans;
}
ll x,p;
char y[maxn];
int main()
{
int t;
for(cin>>t;t;t--)
{
cin>>x>>y>>p;
int n=strlen(y);
if(n<=10)
{
ll k=0;
for(int i=0;i<n;i++)
{
k*=10;
k+=y[i]-'0';
}
printf("%lld\n",q_pow(x,k,p));
}
else
{
ll ph=phi(p),k=0;
for(int i=0;i<n;i++)
{
k*=10;
k+=y[i]-'0';
k%=ph;
}
printf("%lld\n",q_pow(x,k+ph,p));
}
}
}
欧拉降幂的函数
ll phi(ll x)
{
ll ans=x;
for(ll i=2;i*i<=x;i++)
{
if(x%i==0)
{
ans-=ans/i;
while(x%i==0)
x/=i;
}
}
if(x>1)
ans-=ans/x;
return
ans;
}
#include <bits/stdc++.h>
using namespace std;
#define N 300010
struct edge
{
int nex,to;
};
edge e[N<<1];
int head[N],tot;
int a[N];
void add(int from,int to)
{
e[++tot].to=to;
e[tot].nex=head[from];
head[from]=tot;
}
int dep[N],fa[N][50],lg[N];
void DFS(int now,int fath)
{
dep[now]=dep[fath]+1;
fa[now][0]=fath;
for(int i=1;i<=lg[dep[now]];i++)
{
fa[now][i]=fa[fa[now][i-1]][i-1];
}
for(int i=head[now];i;i=e[i].nex)
{
if(e[i].to!=fath)
{
DFS(e[i].to,now);
}
}
}
int lca(int x,int y)
{
if(dep[x]<dep[y])
swap(x,y);
while(dep[x]>dep[y])
{
x=fa[x][lg[dep[x]-dep[y]]-1];
}
if(x==y)
return x;
for(int i=lg[dep[x]]-1;i>=0;i--)
{
if(fa[x][i]!=fa[y][i])
{
x=fa[x][i];
y=fa[y][i];
}
}
return fa[x][0];
}
int power[N];
void get(int now,int fath)
{
for(int i=head[now];i;i=e[i].nex)
{
if(e[i].to==fath)
continue;
get(e[i].to,now);
power[now]+=power[e[i].to];
}
}
int main()
{
//freopen("in.txt","r",stdin);
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=1,x,y;i<n;i++)
{
cin>>x>>y;
add(x,y);
add(y,x);
}
for(int i=1;i<=n;i++)
{
lg[i]=lg[i-1]+(1<<lg[i-1]==i);
}
DFS(1,0);
for(int i=1,u,v,t;i<n;i++)
{
u=a[i];
v=a[i+1];
t=lca(v,u);
power[u]++,power[v]++,power[t]--,power[fa[t][0]]--;
}
get(1,0);
for(int i=2;i<=n;i++)
power[a[i]]--;
for(int i=1;i<=n;i++)
cout<<power[i]<<endl;
return 0;
}