首页 > 其他分享 >SPOJ6059 GCDSQF Another GCD Problem 题解

SPOJ6059 GCDSQF Another GCD Problem 题解

时间:2022-10-06 21:12:31浏览次数:60  
标签:SPOJ6059 square limits int 题解 MAXN GCDSQF cases prod

题目大意

给定两个 square-free number \(A\) 和 \(B\)(即没有一个素因子的次数达到 \(2\) 的数) 的 01 表示形式(即将其有无该素因子排列出来,如 \(105=3\times 5\times 7\),则 \(105\) 的 01 表示形式为 0111)。求 \(\gcd(A+B,\operatorname{lcm}(A,B))\)。如果结果不是 square-free nunmber 则用十进制输出,如果结果是 \(1\) 则输出 relatively prime

分析

一道小清新的数论题。

因为 \(A\) 和 \(B\) 是 square-free number,考虑将其唯一分解。设

\[\begin{cases}A=\prod\limits_{i=1}^np_i\\B=\prod\limits_{i=1}^mq_i\\\gcd(A,B)=\prod\limits_{i=1}^cx_i\end{cases} \]

将 \(\{p_i\}\) 和 \(\{q_i\}\) 属于 \(\{x_i\}\) 的部分移动到前 \(c\) 个,那么可得:

\[\begin{cases}A+B=\prod\limits_{i=1}^cx_i(\prod\limits_{j=1}^{n-c}p_{j+c}+\prod\limits_{k=1}^{m-c}q_{k+c})\\\operatorname{lcm}(A,B)=\prod\limits_{i=1}^cx_i\prod\limits_{j=1}^{n-c}p_{j+c}\prod_{k=1}^{m-c}q_{k+c}\end{cases} \]

容易发现

\[\begin{cases}\forall p_{j+c},\ p_{j+c}\nmid\prod\limits_{j=1}^{n-c}p_{j+c}+\prod\limits_{k=1}^{m-c}q_{k+c}\\\forall q_{k+c}, \ q_{k+c}\nmid\prod\limits_{j=1}^{n-c}p_{j+c}+\prod\limits_{k=1}^{m-c}q_{k+c}\end{cases} \]

所以

\[\gcd(A+B,\operatorname{lcm}(A,B))=\gcd(A,B) \]

因此直接统计相同素因子即可。答案一定是 square-free number 或 \(1\)。

实现

记得多测清空。

#include<bits/stdc++.h>
#define HohleFeuerwerke using namespace std
#pragma GCC optimize(3,"Ofast","-funroll-loops","-fdelete-null-pointer-checks")
#pragma GCC target("ssse3","sse3","sse2","sse","avx2","avx")
#define int long long
HohleFeuerwerke;
inline int read(){
	int s=0,f=1;char c=getchar();
	for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
	for(;isdigit(c);c=getchar()) s=s*10+c-'0';
	return s*f;
}
inline void write(int x){
	if(x<0) putchar('-'),x=-x;
	if(x>=10) write(x/10);
	putchar('0'+x%10);
}
const int MAXN=2e3+5;
int T,n,m;
char str1[MAXN],str2[MAXN];
bool A[MAXN],B[MAXN],ans[MAXN];
inline void solve(){
	memset(ans,0,sizeof(ans));
	for(int i=1;i<=max(n,m);i++){
		if(A[i]==B[i]&&A[i]==true) ans[i]=true;
		else ans[i]=false;
	}
	int len=0;
	for(int i=MAXN-5;i>=1;i--){if(ans[i]==true){len=i;break;}}
	if(len==0) puts("relatively prime");
	else{
		for(int i=1;i<=len;i++) write(ans[i]);
		puts("");
	}
}
signed main()
{
	T=read();
	while(T--){
		scanf("%s%s",str1+1,str2+1);
		memset(A,0,sizeof(A));
		memset(B,0,sizeof(B));
		n=strlen(str1+1),m=strlen(str2+1);
		for(int i=1;i<=n;i++){
			if(str1[i]=='0') A[i]=false;
			else if(str1[i]=='1') A[i]=true;
		}
		for(int i=1;i<=m;i++){
			if(str2[i]=='0') B[i]=false;
			else if(str2[i]='1') B[i]=true;
		}
		solve();
	}
	return 0;
}

标签:SPOJ6059,square,limits,int,题解,MAXN,GCDSQF,cases,prod
From: https://www.cnblogs.com/AllWeKnow/p/16758493.html

相关文章

  • [AHOI2022] 钥匙 题解(超详细解密)
    前言青蛙。树上ds好题,运用了很多巧妙的树上问题处理策略。难度2700。题意简述给定一棵\(n\)个点的树,每个节点上要么有一把钥匙,要么有一个宝箱,且钥匙和宝箱都是有颜......
  • CF1256E. Yet Another Division Into Teams 题解 单调队列优化dp
    题目链接:https://codeforces.com/contest/1256/problem/E将\(n\)个数分成若干队,每一队至少包含\(3\)个整数,每一队的代价是最大值与最小值只差,求所有队伍代价之和的最......
  • CF472D题解
    原题CF472DDesignTutorial:InversetheProblem思路概述题意分析给定一个\(n\)点无向图的两两点对之间距离,即经过最短路算法后的邻接矩阵,要求判断原图是否为一个......
  • Educational Round 30 题解
    ContestLink虽然是unrated,不过秉持着EducationalRound的传统,题还是挺不错的。A.ChoresProblemLink评价:善用STL。由于\(a\)已经排好序了,且\(x\le\min_{i=1......
  • CF1415D XOR-gun 题解 二分答案/贪心
    题目链接https://codeforces.com/problemset/problem/1415/D题目大意给定一个长为\(n\)的不降序列,每次操作可以任选相邻的两个数,并将这两个数替换为两个数按位异或的......
  • C语言基础笔试题解析
    题目在这里:​​c语言笔试面试大全,C语言基础笔试题_Thomas杨大炮的博客-CSDN博客t​​2.C语言程序的三种基本结构都有哪些呢?3. ​​递归调用​​和间接递归调用​​定义​......
  • CF1728A Colored Balls: Revisited 题解
    【题目传送门】思路因为球的总数为奇数,所以肯定会剩下一颗球,因此每次都往数量小的拿,那么最后剩下的球一定是最初数量最多的小球的编号。因为假设最多的少一颗,那么将可以......
  • NOIP2015 T3 乱作题解
    题目看起来好像不是很难啊,为什么我做不出来呢;1.暴力枚举枚举x,y,z的值,再判断是否符合条件;时间复杂度:\(\mathcal{O}(n^3)\)期望得分:\(20pts\)\(Code\):#includ......
  • CF870E题解
    题目大意给你平面上\(n(1\leqslantn\leqslant10^5)\)个点,给出他们的坐标\(x_i,y_i(-10^9\leqslantx_i,y_i\leqslant10^9)\)。对于每个点有三种操作:不进行任何操......
  • P2149 [SDOI2009] Elaxia的路线 题解
    首先考虑分别求出在两个人最短路上的边,这个就是用\(s\)跑一遍最短路,\(t\)跑一遍最短路,然后枚举边\((u,v)\),如果满足\((s\tou)+(u\tov)+(t\tov)=(s\tot)\)那么......