Codeforces Edu 81 D(数学) & E(数据结构)


这场打的贼烂,D和E都挺可做的,居然没时间写。搞了半天签了三道,B一个小bug被hack,CTLE在test 30 。

D. Same GCDs

分析 : 给出 a 和 m ,问有多少个 x 使得 GCD(a , m) = GCD(a + x , m) 。
我的做法: 简单容斥,详见代码 。 这题其实挺简单的,没写出来不应该
code :
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<ll> p;
ll GCD(ll a,ll b){return b==0?a:GCD(b,a%b);}
ll rongchi(ll x)
{
	ll ans=0;
	for(int i=1;i<(1<<p.size());i++) {
		int bits=0; ll mul=1;
		for(int j=0;j<p.size();j++) 
			if(i&(1<<j)) mul*=p[j],bits++;
		if(bits&1) ans+=x/mul;
		else ans-=x/mul;
	}
	return ans;
}
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		p.clear();
		ll a,m,gcd;
		scanf("%lld%lld",&a,&m);
		gcd=GCD(a,m);
		if(gcd==1) printf("%lld\n",phi(m));
		else {
			m/=gcd; a/=gcd;
			ll tmp=m;
			for(ll i=2;i*i<=tmp;i++) 
				if(tmp%i==0) {
					p.push_back(i);
					while(tmp%i==0) tmp/=i;
				}
			if(tmp>1) p.push_back(tmp);
			printf("%lld\n",m-(rongchi(a+m-1)-rongchi(a)));
		}
	}
    return 0;
}
tutorial的做法,虽然他写了一堆我没看明白,不过直接看代码倒是一下就懂了
code :
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll GCD(ll a,ll b){return b==0?a:GCD(b,a%b);}
ll phi(ll n)
{
    ll ans=n;
    for(ll i=2;i*i<=n;i++) 
        if(n%i==0) {
            ans=ans/i*(i-1);
            while(n%i==0) n/=i;
        }
    if(n>1) ans=ans/n*(n-1);
    return ans;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        ll a,m;
        scanf("%lld%lld",&a,&m);
        printf("%lld\n",phi(m/GCD(a,m)));
    }
    return 0;
}

E. Permutation Separation

分析 :
全部评论

相关推荐

程序员小白条:找实习多投就行,但25届现在是春招时间呃呃呃,你想以后参加社招吗
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务