02因子化简
#include<bits/stdc++.h>
using namespace std;
const int maxn=10000;
vector<int> prime;
bool is_prime[maxn];
void cal_prime(){
for(int i=0;i<maxn;++i) is_prime[i]=true;
for(int i=2;i<maxn;i++){
if(is_prime[i]==false) continue;
prime.push_back(i);
for(int j=i*i;j<maxn;j+=i){
is_prime[j]=false;
}
}
}
long long de_prime(long long x,int bound){
long long ans=1;
for(auto p:prime){
int cnt=0;
while(x%p==0){
x/=p;
cnt++;
}
if(cnt>=bound){
ans*=pow(p,cnt);
}
}
return ans;
}
int main(){
int t;
cin>>t;
cal_prime();
while(t--){
long long a,b;
cin>>a>>b;
long long ans=de_prime(a,b);
cout<<ans<<endl;
}
return 0;
}
03树上搜索
#include<bits/stdc++.h>
using namespace std;
const int maxn=3000;
#define ll long long
ll w[maxn],wv[maxn];
int n,m;
vector<int> trees[maxn];
int f[maxn];
bool die[maxn];
int root;
ll cal(const ll &a,const ll &total){
return abs(2*a-total);
}
ll dfs(int u,int uu,int &cnt){
cnt++;
wv[u]=w[u];
for(auto v:trees[u]){
if(v!=uu&&die[v]==false){
wv[u]+=dfs(v,u,cnt);
}
}
return wv[u];
}
void getMinIdx(int u,int uu,int &idx){
for(auto v:trees[u]){
if(v!=uu&&die[v]==false){
if(cal(wv[v],wv[root])<cal(wv[idx],wv[root])){
idx=v;
}
if(cal(wv[v],wv[root])==cal(wv[idx],wv[root])){
idx=min(idx,v);
}
getMinIdx(v,u,idx);
}
}
};
bool check(int &mi,int cur){
if(mi==cur) return true;
while(cur!=0){
if(cur==mi) return true;
cur=f[cur];
}
return false;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;++i){
cin>>w[i];
}
for(int i=2;i<=n;++i){
int last;
cin>>last;
trees[last].push_back(i);
f[i]=last;
}
f[1]=0;
while(m--){
int cur;
cin>>cur;
root=1;
memset(die,false,sizeof die);
memset(wv,0,sizeof wv);
while(1){
int cnt=0;
dfs(root,0,cnt);
if(cnt==1){ break; }
int idx=root;
getMinIdx(root,0,idx);
if(check(idx,cur)==true) root=idx;
else die[idx]=true;
cout<<idx<<" ";
}
cout<<endl;
}
return 0;
}
04宝藏(35分)
#include<bits/stdc++.h>
#include<deque>
using namespace std;
#define ll long long
const ll mod=998244353;
int n,m;
void update(vector<vector<ll> > &command){
ll i,v,a,b,c,d;
cin>>i;
command[i].clear();
cin>>v;
command[i].push_back(v);
if(v!=3){
for(int j=0;j<4;++j){
ll x;
cin>>x;
command[i].push_back(x);
}
}
}
void get_code(vector<vector<ll> > &command){
int l,r;
cin>>l>>r;
deque<vector<ll> > que;
vector<ll> m;
m.push_back(1);
m.push_back(0);
m.push_back(0);
m.push_back(1);
int last=0;
for(int i=l;i<=r;++i){
if(command[i][0]==1){
vector<ll> temp;
for(int j=1;j<5;++j){
temp.push_back(command[i][j]);
}
que.push_front(temp);
que.push_back(m);
}else if(command[i][0]==2){
vector<ll> temp;
for(int j=1;j<5;++j){
temp.push_back(command[i][j]);
}
que.push_back(temp);
que.push_front(m);
}else{
if(!que.empty()){
if(last=0) que.pop_front();
que.pop_back();
}
}
}
ll a=1,b=0,c=0,d=1;
while(!que.empty()){
vector<ll> cur=que.front();
que.pop_front();
ll x,y,z,u;
x=a*cur[0]%mod+b*cur[2]%mod;
y=a*cur[1]%mod+b*cur[3]%mod;
z=c*cur[0]%mod+d*cur[2]%mod;
u=c*cur[1]%mod+d*cur[3]%mod;
a=x%mod,b=y%mod,c=z%mod,d=u%mod;
}
cout<<a<<" "<<b<<" "<<c<<" "<<d<<endl;
}
int main(){
cin>>n>>m;
vector<vector<ll> > command(n+1);
for(int i=1;i<=n;++i){
int v,x;
cin>>v;
command[i].push_back(v);
if(v!=3){
for(int j=0;j<4;++j){
ll x;
cin>>x;
command[i].push_back(x);
}
}
}
for(int i=0;i<m;++i){
ll x;
cin>>x;
if(x==1){
update(command);
}else{
get_code(command);
}
}
return 0;
}