小白月赛78 A-E

A

“芝士肾么?”

地上有一根木桩,在木桩上栓有一根长度为 a 的木绳,木绳的末端还栓有一根长度为 b 的木棍,现在小沙想要知道,木棍可能扫过的位置在地面上的投影面积有多大。

输入描述:

第一行输入两个正整数 a,b,代表木绳以及木棍的长度。
保证有 1≤a,b≤100。

#include
using namespace std;
#define int long long 
const int N=1e6+10;
typedef double db;
# define PI acos(-1)
int a,b;
signed main()
{
     cin>>a>>b;
     
     int c=a+b;
     
     db f=c*c*PI;
     
     cout<

 

B

蒸馍?你不福气?”

在很多比赛中,会有如下图所示的计分表,每次得分之后会翻动来表示得分。
 

小白月赛78 A-E_第1张图片



先给定如上图所示记分表,并给定一个长度为 n 的比赛获胜记录,小沙需要记录整场比赛中,每次计分表变化之后,数字 0 出现了多少次。

小沙:“ACMer,帮帮我”。

输入描述:

第一行,输入一个长度不超过 n 的字符串,保证字符串中仅包含 `a` 和 `b`。

其中 `a` 代表红方获胜得一分,`b` 代表蓝方获胜得一分。

保证有1≤n≤99。

输出描述:

输出一个整数代表数字 0 出现的个数。

示例1

输入

aab

输出

8

说明

第一次红方得分,计分表变成 `0001`,出现了 3 个 0。

第二次红方得分,计分表变成 `0002`,出现了 3 个 0。

第一次蓝方得分,计分表变成 `0102`,出现了 2 个 0。

总计出现了 8 次数字 0。

 

#include
using namespace std;
#define int long long 
const int N=1e6+10;
typedef double db;
# define PI acos(-1)
string f;
int a,b; 
int cnt=0;
void cal(int x)
{
	if(x==1){
		a++;
	}
	else{
		b++;
	}
	if(a%10==0){
		cnt++;
	}
	if(b%10==0){
		cnt++;
	}
	if(a<=9){
		cnt++;
	}
	if(b<=9){
		cnt++;
	}
}
signed main()
{
     cin>>f;
     
     int sz=f.size();
     //1 红方  2 蓝方 
     for(int i=0;i

C

“O.o?”

集合中一开始拥有两个数字 a 和 b,如果 a 与 b 相同,那么仅有一个数字。

小沙每次可以选择集合中的两个数(可以相同),将他们的和放入集合中,请问所有可能的集合中,第 K 小的值最小为多少?

注:集合中相同元素只能有一个。

输入描述:

 
   

第一行,输入三个整数 k,a,b 。

保证有1≤k≤10^6,1≤a,b≤10^9。

输出描述:

 
   

输出一个数字代表答案。

示例1

输入

3 2 3

输出

4
#include
using namespace std;
#define int long long 
#define fp(i,a,b) for(int i=a;i<=b;++i)
const int N=1e6+10;
typedef double db;
# define PI acos(-1)
int k,a,b;
sets;
signed main()
{
     cin>>k>>a>>b;
     
     s.insert(a);
     s.insert(b);
     
     int las;
     
     fp(i,1,k){
     	las=*s.begin();
     	s.erase(s.begin());
     	s.insert(las+a);
     	s.insert(las+b);
	 } 
	 
	 cout<

 D

题目描述

“开导!”

众所周知,树是一种特殊的图。
 

众所周知(二),导出子图是由该图顶点的一个子集和该图中两端均在该子集的所有边的集合组成的图。

注1:二叉树是有向图。

注2:有向图的导出子图,还是有向图。

小沙有 nnn 个节点,他需要你构造出一颗有根二叉树,使得二叉树的所有导出子图是一颗满二叉树的数目尽可能多。

请问构造出来的有根二叉树的所有导出子图是一颗满二叉树的数目最多是多少?

你能帮帮不会数/树的小沙吗?

输入描述:

 
   

第一行读入一个整数 T ,代表多组样例。

随后T 行,每行输入一个正整数 n。

保证有1≤T≤10^5,1≤n≤10^18。

输出描述:

 
   

对于每组样例输出一行整数代表答案。

由于答案过大,所以请输出答案对 10^9 + 7 取模的值。

示例1

输入

10
1
2
3
4
5
6
7
8
9
10

输出

1
2
4
5
7
8
11
12
14
15

#include
using namespace std;
#define int long long 
#define fp(i,a,b) for(int i=a;i<=b;++i)
const int N=1e6+10;
typedef double db;
# define PI acos(-1)
const int mod=1e9+7;
int a[100];
int b[100];
int sum[100];
int T;
int x;
void init()
{
	a[0]=1;
	for(int i=1;i<=60;i++)
	{
		a[i]=a[i-1]*2; 
	}
	for(int i=1;i<=60;i++)
	{
		b[i]=a[i]-1;
	}
	for(int i=1;i<=60;i++)
	{
	   sum[i]=sum[i-1]+b[i];
	   sum[i]%=mod;
	}
}
void solve()
{
	cin>>x;
	int pos;
	int sums=0;
	for(int i=60;i>=1;i--)
	{
		if(b[i]<=x)
		{
			pos=i;
			break;
		}
	}
//	cout<>T;
    
    while(T--)
    {
    	solve();
	}
    
	return 0;
} 

E


题目描述

“WA/AC 自动机!”

给定一个长度为 m 的序列 a,分别为 a0​,a1​,a2​...am−1​,一开始你拥有一个初始数为 x,你的第 i 次操作会使得 x=(x+a(i−1)%m)%n,请问至少多少次操作才能使 x 变成0。

如果无论多少次操作均无法使 x=0,那么输出 −1。

输入描述:

第一行输入三个整数 n,m,x。

第二行输入 m 个整数代表序列 a。

保证有 1≤n,m≤10^5,0≤x 
   

输出描述:

 
   

输出一个整数代表答案。

示例1

输入

8 3 1
1 2 3

输出

4

说明

 
   

一开始 x=1x = 1x=1。
进行第一次操作后 x=1+1=2(mod8)
进行第二次操作后 x=2+2=4(mod8)
进行第三次操作后 x=4+3=7(mod8)
进行第四次操作后 x=7+1=0(mod8)

示例2

输入

2 1 0
1

输出

0

示例3

输入

4 1 1
2

输出

-1

 

#include
using namespace std;
#define int long long 
#define fp(i,a,b) for(int i=a;i<=b;++i)
const int N=1e6+10;
typedef double db;
# define PI acos(-1)
int n,m,x;
int a[N];
int pre[N];
mapmp;
signed main()
{
	cin>>n>>m>>x;
    
    fp(i,1,m){
    	cin>>a[i];
    	pre[i]=(pre[i-1]+a[i])%n;
    	if(!mp.count(pre[i])){
    		mp[pre[i]]=i;
		}
	}
	
	int ans=-1;
	
	for(int i=1;i<=n;i++)
	{
		int need=n-x;
		if(x==0){
			ans=(i-1)*m;
			break;
		}
		else{
			if(mp.count(need)){
				ans=(i-1)*m+mp[need];
				break;
			}
		}
		x=(x+pre[m])%n;
	}
	cout<

代码后面部分用到了鸽巢定理

前面部分是怎么套鸽巢定理

感觉是个很好的idea

你可能感兴趣的:(算法,c++,数据结构)