ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

今日两道题-1

2021-03-19 17:31:29  阅读:204  来源: 互联网

标签:prime int long num maxn ans 今日 两道


A 九峰与签到题

题目链接1
一道简单模拟题,题意就是统计概率超过50%的题目的题号,但这道题最坑的地方就是任意时间内通过率大于等于50%的题为签到题
当时没有正确理解这句话,导致自己算的都是统计完后再求的概率,wa的好几发,
结果最后发现它是在统计阶段就要判定它是否是签到题,就是说一开始没有通过就不是签到题
由于我比较菜,也不经常用STL,自己用的三个结构体+hash也出来了。

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+100;
struct node1 {
	int num;
	string op;
} a[maxn];
struct node2 {
	int AC;
	int tot;
} vis[30];//标记AC和提交总数
//r数组保存结果,且用flag标记,如果某一时刻一道题AC概率低于50%,就标记为1
struct node3{
	int num;
	int flag;
}r[30];
int main() {
	int m,n;
	int cnt=0,z[30];
	scanf("%d%d",&m,&n);
	for(int i=0; i<m; i++) cin>>a[i].num>>a[i].op;
	for(int i=0; i<m; i++) {
		r[a[i].num].flag=1;
		if(a[i].op=="AC") vis[a[i].num].AC++;
		vis[a[i].num].tot++;
		if(vis[a[i].num].tot>2*vis[a[i].num].AC) r[a[i].num].num=1; 
	}
	for(int i=1;i<30;i++){
		if(r[i].flag&&!r[i].num) z[cnt++]=i;
	}
	for(int i=0;i<cnt;i++){
		if(i==0) printf("%d",z[i]);
		else printf(" %d",z[i]);
	}
	return 0;
}

J 邬澄瑶的公约数

题目链接2
这一道题要用到的算法有素数筛,快速幂,以及质因子分解+暴力就过了
题意大概就是说:
给你一串数x1,x2,x3…xn,
然后告诉再给你相同长度的一串数k1,k2,k3…kn
然后求出x1^k1 , x2^k2 , x3^k3 ,… xn^kn这一串数字的gcd,数很大要对1e9+7取模
数据范围n,x都是1e4
这道题的解题思想是:
如果两个数一个数是x=2^3 * 3^5 , y=2^4 * 3^4
那么gcd(x,y)=2^3 * 3^4

所以就是说只要把这一串数的相同质因子都求出来(遍历)
然后对这些的相同的质因子,指数取最小,保存在一个数组num中。
然后要记得质因子全都是素数所以要记得
最好把所有的prime[j]^num[j]指数相乘取模就行了
希望我有一天能不看题解也能写出来QWQ

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e4+100,mod=1e9+7;
int prime[maxn],x[maxn],num[maxn];
int visit[maxn],k[maxn];
int n;
long long ksm(int a,int b) {//快速幂算法
	long long t=a,ans=1;
	while(b) {
		if(b&1) ans=ans*t%mod;
		t=t*t%mod;
		b>>=1;
	}
	return ans;
}
void Prime() {//欧拉素数筛
	memset(visit,0,sizeof(visit));
	memset(prime,0,sizeof(prime));
	for (int i = 2; i <= maxn; i++) {
		if (!visit[i]) {
			prime[++prime[0]] = i;
		}
		for (int j = 1; j <=prime[0] && i*prime[j] <= maxn; j++) {
			visit[i*prime[j]] = 1;
			if (i%prime[j]==0) {
				break;
			}
		}
	}
}
int main() {
	Prime();
	scanf("%d",&n);
	for(int i=1; i<=n; i++) scanf("%d",&x[i]);//每个x
	for(int i=1; i<=n; i++) scanf("%d",&k[i]);//每个x上对应的指数
	memset(num,0x7f7f7f7f,sizeof(num));
	for(int i=1; i<=n; i++) {
		for(int j=1; j<=prime[0]; j++) {
			int t=0;
			while(x[i]%prime[j]==0) x[i]/=prime[j],t++;//求出每个x[i]的质因子,以及指数
			num[j]=min(num[j],t*k[i]);
		}
	}
	long long ans=1;
	for(int j=1; j<=prime[0]; j++) {
		if(num[j]==0) continue;
		ans=ans*ksm(prime[j],num[j])%mod;
	}
	cout<<ans<<endl;
}

标签:prime,int,long,num,maxn,ans,今日,两道
来源: https://blog.csdn.net/xzy15703841578/article/details/115009682

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有