2020牛客寒假算法基础集训营1

honoka和格点三角形

题目描述:
honoka最近在研究三角形计数问题。
她认为,满足以下三个条件的三角形是“好三角形”。
1.三角形的三个顶点均为格点,即横坐标和纵坐标均为整数。
2.三角形的面积为1 。
3.三角形至少有一条边和x轴或y轴平行。
honoka想知道,在平面中选取一个大小为 n*m的矩形格点阵,可以找到多少个不同的“好三角形”?由于答案可能过大,请对1e9+7 取模。
输入描述:
两个正整数n和m(2 ≤n,m≤109)
输出描述:
面积为1的格点三角形的数量,对 10^9+7取模的结果。

示例1
输入

2 3
输出
6
说明
格点如下:
. . .
. . .
不妨设左下角坐标为(1,1),右上角坐标为到(3,2)。
那么三点坐标可选:
(1,1)(1,2)(3,1)
(1,1)(1,2)(3,2)
(1,1)(2,2)(3,1)
(1,1)(3,1)(3,2)
(1,2)(2,1)(3,2)
(1,2)(3,1)(3,2)
所以共有6个。
示例2
输入

100 100
输出
7683984
理解:

这里是引用

#include<iostream>
#include<cstdio>
using namespace std;
const int mod=1e9+7;
typedef long long ll;
int main()
{
	 ll y,x,sum,h1,h2,w1,w2;
	 cin>>y>>x;
 	h1=2*(x*(x-2)%mod*(y-1)%mod)%mod;
 	h2=2*(y*(y-2)%mod*(x-1)%mod)%mod;
 	w1=2*((x-2)*(x-1)%mod*(y-2)%mod)%mod;
 	w2=2*((y-2)*(y-1)%mod*(x-2)%mod)%mod;
 	sum=(h1+h2+w1+w2)%mod;
 	cout<<sum;
 	return 0;
 } 

kotori和bangdream

题目描述

有一天,kotori发现了一个和lovelive相似的游戏:bangdream。令她惊讶的是,这个游戏和lovelive居然是同一个公司出的!
kotori经过一段时间的练习后已经变得非常触,每个音符 x% 的概率perfect,获得 a分, (100−x)% 概率great,获得 b分。
已知一首歌有 n个音符。kotori想知道,不考虑连击加成的话,一首歌得分的期望是多少?
输入描述:

一行4个整数,用空格隔开。分别是 n,x,a,b 。
输出描述:

一首歌得分的期望,保留两位小数。
示例1
输入

100 50 500 400
输出

45000.00
说明

如果全perfect是50000分,全great是40000分。由于它们的概率都是50%,即perfect和great五五开,所以期望是45000分。

#include<iostream>
#include<cstdio>
using namespace std;
int a[100010];
int main()
{
 	int n,x,a,b;
	 double sum=0;
	 cin>>n>>x>>a>>b;
 	sum=a*x*1.0/100+b*(100-x)*1.0/100;
	 sum=sum*n;
	 printf("%.2lf",sum);
	 return 0;
} 

hanayo和米饭

题目描述

hanayo很喜欢吃米饭。
有一天,她拿出了 n个碗,第一个碗装了 1 粒米饭,第二个碗装了 2 粒米饭,以此类推,第 n 个碗装了 n 粒米饭。
然而,爱搞恶作剧的rin把所有的碗的顺序打乱,并拿走了一个碗。hanayo想知道,rin拿走的碗里有多少粒米饭?

输入描述:

第一行输入一个正整数 n 。代表原始的总碗数。
第二行输入 n-1 个正整数 ai​ ,代表目前每碗里米饭数量。
保证输入合法。(2<=n<=100000,1<=ai<=n)
输出描述:

输出一个正整数,代表rin拿走的碗里米饭数量。
示例1
输入

5
2 5 1 3
输出

4

#include<iostream>
#include<cstdio>
using namespace std;
int a[100010];
int main()
{
	int n,t,k=0;
 	cin>>n;
	for(int i=0;i<n-1;i++)
 	{
 		 cin>>t;
 		 a[t]=1;
	 }
	 for(int i=1;i<=n;i++)
	 {
 		 if(!a[i])
	 	{
  			k=i;
   			break;
  		}
 	}
 	cout<<k;
 	return 0;
} 

rin和快速迭代

rin最近喜欢上了数论。
然而数论实在太复杂了,她只能研究一些简单的问题。
这天,她在研究正整数因子个数的时候,想到了一个“快速迭代”算法。设f(x)为 x 的因子个数,将 f 迭代下去,rin猜想任意正整数最终都会变成 2 。
例如:f(12)=6,f(6)=4,f(4)=3,f(3)=2 。
她希望你帮她验证一下。她会给你一个正整数 n,让你输出它在迭代过程中,第一次迭代成 2 的迭代次数。

输入描述:
一个正整数 n(3<=n<=10^12)

输出描述:
一个正整数,为 n 迭代至 2 的次数。

示例1
输入

12
输出

4
说明

12的因子:1,2,3,4,6,12。共6个。
6的因子:1,2,3,6。共4个。
4的因子:1,2,4。共3个。
3的因子:1,3。共2个。12 → 6 → 4 → 3 → 2 , 故迭代了4次。

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
typedef long long ll;
ll F(ll x)
{
 	ll count=0;
 	for(int i=1;i<sqrt(x);i++)
 	{
  		if(x%i==0)
   		count+=2; 
 	}
 	double a=sqrt(x);
 	ll b;
 	if((ll)a==a)
 	{
  		b=a;
  		if(x%b==0)
  			count++;
	 }
	return count;
}
int main()
{
 	ll n,count=1;
 	cin>>n;
 	ll t=F(n);
 	while(t!=2)
	{
  		t=F(t);
  		count++;
 	}
 	cout<<count;
 	return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值