文章目录
C. Enlarge GCD
Codeforces Round #511 (Div. 2)
题目链接:http://codeforces.com/contest/1047/problem/C
题意:最少删除多少个数使得剩下的数的gcd比所有的数的gcd大
开个数组记录每个数出现了多少次,然后枚举因子,看含有这个因子的数有多少个,如果个数比 n 小,那么就说明 N−cnt 个数没有这个因子
然后还有个vis来节省时间,比如枚举5的倍数的时候,就把所有10的倍数都包含了
#include"bits/stdc++.h"
#define out(x) cout<<#x<<"="<<x
#define C(n,m) (m>n?0:(long long)fac[(n)]*invf[(m)]%MOD*invf[(n)-(m)]%MOD)
using namespace std;
typedef long long LL;
const int maxn=15e6+5;
const int MOD=1e9+7;
bool vis[maxn];
int cnt[maxn];
int main()
{
int N;
while(cin>>N)
{
memset(cnt,0,sizeof cnt);
memset(vis,0,sizeof vis);
int d=0,mx=0;
for(int i=1;i<=N;i++)
{
int t;
scanf("%d",&t);
cnt[t]++;
d=__gcd(d,t);
mx=max(mx,t);
}
int ans=N;
for(int i=d+1;i<=mx;i++)
{
if(vis[i]==0)
{
int c=0;//±£´æº¬ÓÐÒò×ÓiµÄÊýµÄ¸öÊý
for(int j=i;j<=mx;j+=i)//ö¾Ùº¬ÓÐÒò×ÓiµÄ±¶Êý
{
vis[j]=1;
c+=cnt[j];
}
ans=min(ans,N-c);//ÓÐc¸öÊý³öÏÖÁËÒò×Ój£¬Ê£ÏµľÍÊÇûÓÐÕâ¸öÒò×ÓµÄ
}
}
if(ans<N)cout<<ans<<endl;
else cout<<-1<<endl;
}
}
E-欧拉
牛客练习赛27
题目链接:https://www.nowcoder.com/acm/contest/188/E
题解是说两个函数都是极性函数,那么他们的乘积也是积性函数,然后就跟筛莫比乌斯函数,欧拉函数那些类似的做法
如果 n 和 m 互质,那么 f(nm)=f(n)⋅f(m)
关键是不互质的时候,每种函数的处理就是在这里不同
这道题就是这样处理的,假如 p 是一个新的质数
f(np)=f(n)⋅pk
怎么找出这个关系的我也不知的T_T
#include"bits/stdc++.h"
#define out(x) cout<<#x<<"="<<x
#define C(n,m) (m>n?0:(long long)fac[(n)]*invf[(m)]%MOD*invf[(n)-(m)]%MOD)
using namespace std;
typedef long long LL;
const int maxn=5e6+5;
const int MOD=998244353;
LL ksm(LL a,LL b,LL mod)
{
LL res=1,base=a;
while(b)
{
if(b&1)res=(res*base)%mod;
base=(base*base)%mod;
b>>=1;
}
return res;
}
vector<int>prime;
bool vis[maxn];
LL F[maxn];
int M,K;
void PHI(int n)
{
memset(vis,1,sizeof(vis));
F[1]=1;
for(LL i=2;i<=n;i++)
{
if(vis[i])
{
prime.push_back(i);
F[i]=(ksm(i,K,MOD)-1+MOD)%MOD;
}
for(int j=0;j<prime.size()&&i*prime[j]<=n;j++)
{
vis[i*prime[j]]=0;
if(i%prime[j]==0)
{
F[i*prime[j]]=F[i]*ksm(prime[j],K,MOD)%MOD;
break;
}
else F[i*prime[j]]=F[i]*F[prime[j]]%MOD;
}
}
}
int main()
{
while(cin>>M>>K)
{
PHI(maxn-5);
while(M--)
{
int N;
cin>>N;
cout<<F[N]<<endl;
// for(int i=1;i<=10;i++)cout<<"i="<<i<<" "<<F[i]<<endl;
}
}
}