HDU 5207 Greatest Greatest Common Divisor
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=5207 题目翻译 一个数列,求两个数之间最大的GCD 题解 计算所有约数,属于多少个数字,在大于等于2的里面找最大的。 代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
#include<cstdio> #include<cstring> using namespace std; const int Maxn=1e5; int n; int num[Maxn+5]; int gcd[Maxn+5]; inline void solve(int T){ memset(gcd,0,sizeof(gcd)); scanf("%d",&n); for (int i=1;i<=n;i++) scanf("%d",&num[i]); for (int i=1;i<=n;i++){ for (int k=1;k*k<=num[i];k++){ if (num[i]%k==0){ gcd[k]++; if (k*k!=num[i]) gcd[num[i]/k]++; } } } int Ans=1; for (int i=1;i<=Maxn;i++) if (gcd[i]>=2) Ans=i; printf("Case #%d: %d\n",T,Ans); } int main(){ int T=0; while(scanf("%d",&T)!=EOF){ for (int i=1;i<=T;i++){ solve(i); } } return 0; } |
HDU 5968 异或密码
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=5968 题解 因为范围很小,所以我们只需要先暴力出每个子区间的大小,然后对每个询问枚举答案即可。 代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
//while(true) RP++; #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> using namespace std; const int Maxn=100; int num[Maxn+5]; int ans[2500]; int n,m; inline void solve(int T){ memset(ans,-1,sizeof(ans)); scanf("%d",&n); for (int i=1;i<=n;i++) scanf("%d",&num[i]); for (int i=1;i<=n;i++){ int now=0; for (int j=i;j<=n;j++){ now=now^num[j]; if (ans[now]==-1 || ans[now]<j-i+1) ans[now]=j-i+1; } } scanf("%d",&m); for (int i=1;i<=m;i++){ int qey,opt=-1; scanf("%d",&qey); for (int delta=0;delta<=1024+2048&&opt==-1;delta++){ if (0<=qey-delta && qey-delta<=2048) opt=max(opt,ans[qey-delta]); if (0<=qey+delta && qey+delta<=2048) opt=max(opt,ans[qey+delta]); } printf("%d\n",opt); } printf("\n"); } int main(){ int T=0; while(scanf("%d",&T)!=EOF){ for (int i=1;i<=T;i++) solve(i); } return 0; } |