第一次熬夜打CF (打CF游戏都没有熬夜打过呜呜呜)
踏上了cf上分掉分 之旅,这里记录一下一些好的题目加以练习锻炼思维
2020.12.20开坑
2020.12.20 求质因数的方法
#include<bits/stdc++.h>
#define ll long long
#define fp(i,a,b) for(int i=a;i<=b;i++)
#define sfp(i,a,b) for(int i=a;i<b;i++)
const ll N = 1e6+10;
using namespace std;
ll t;
ll p,q,cnt;
ll a[N],cnt1[N],cnt2[N];
void solve()
{
cin>>p>>q;
if(p%q!=0) cout<<p<<endl;
else
{
cnt=0;
ll b=sqrt(q);
ll P=p;
//求q的质因数用a[]存起来,用cnt1存含有的个数
fp(i,2,b)
{
if(q%i==0) a[++cnt]=i;
while(q%i==0)
{
cnt1[cnt]++;
q/=i;
}
}
if(q>1) //如果q本身就是质数
{
a[++cnt]=q;
cnt1[cnt]=1;
}
//OVER
fp(i,1,cnt)
{
while(p%a[i]==0)
{
cnt2[i]++;
p/=a[i];
}
}
ll ans=0;
fp(i,1,cnt)
{
ll c=cnt2[i]-cnt1[i]+1;
ll sum=1;
for(int j=1;j<=c;j++) sum*=a[i];
//sum=pow(a[i],c);
ans=max(ans,P/sum);
}
cout<<ans<<endl;
fp(i,1,cnt) cnt1[i]=0,cnt2[i]=0;
}
}
signed main() {
ios::sync_with_stdio(0), cin.tie(0);
cin>>t;
while(t--) solve();
}
求数的质因数打方法在代码里面(注释)
该题的思路是找当p%q==0时,也就是q为p一个因子时,p中其他因子,且不能被q整除的最大值。
先将q拆除质因数表示的形式 如12=223(两个2和一个3),由于q为p因数,故p也含有这些质因数,将相同质因数的个数相减+1去枚举求出最大的因子。
P=12=223, Q=6=23 p2-q2+1=2, 22=4 有点抽象
2021.1.6 掉大分
Codeforces Round #694 (Div. 2) B题补题
#include<bits/stdc++.h>
#define int ll
#define ll long long
#define fp for(int i=1;i<=n;i++)
#define sfp for(int i=0;i<x;i++)
const ll N = 2e7+5;
using namespace std;
ll n,x;
ll a[N];
void solve() {
cin>>n>>x;
ll sum=0;
fp {
cin>>a[i];
sum+=a[i];
}
ll tt=x;
fp{
if(a[i]%tt==0) sum+=a[i];
else break;
if(i==n)
{
tt*=x;
i=0;
}
}
cout<<sum<<endl;
}
ll t;
signed main() {
ios::sync_with_stdio(0), cin.tie(0);
cin>>t;
while(t--)
solve();
return 0;
}
参考巨佬得思路
2中的数组为[4,6,8,2],x为2,之后数组内产生的新元素为[2,2,3,3,4,4,1,1,1,1,1,1],再把它们合并一下就成了[4,6,8,2,4],发现每次循环,只需要将除数扩大一倍,再跑一遍,只要除不了就直接跳出即可