今天是集训第二天,模拟赛4题,一题都没有对。
题目如下:
小W吃完了饭,想要在小区里散步!小W住的小区的房子排布非常奇怪:整个小区的房子绕成了一个环形,在顺时针方向上依次编号为1,2,···, n。小W住在第x号楼,散步时,他会绕着这个环逆时针散步。由于这些楼房都没有标记是第几栋,小W走了一会就找不到自己在第几栋楼了,只记得自己逆时针经过y栋楼(开始时自己那栋楼不算经过)。你可以帮小W算算他现在在第几号楼吗
输入格式
输入仅一行,为三个正整数n, x, y,含义如题意所示:5 2 2
输出格式
输出一行一个正整数,表示小W散步后位于第几号楼: 5
小W从2号楼开始逆时针经过两栋楼,相当于走了两步,到达了5号楼
我一开始是这样写的:
#include
using namespace std;
long long y,last=0;
int n,x;
int main()
{
cin >> n >> x >> y;
last=x-y;
while(last<=0)
{
last=last+n;
}
cout << last;
return 0;
}
但是,这个用while循环,超时了。
T2
题目如下:
输入格式
输入的第一行为一个正整数T,表示小W希望你计算T个字符串的哈希值。接下来T行,每行有一个小写字符串S和对应的模数p,表示他希望你计算字符串S在进制转换法下得到的数字模p后的值。以十进制输出。请认真阅读样例解释,以确保你所理解的进制转换法与题意是正确的。2.输出格式
输出T行T个整数,表示你所计算的哈希值。2.4样例
12.4.1
样例输入
3
zard 139
zerd 139
wib 123
2.4.2
样例输出
49
112
75
2.4.3
样例解释
将a视作0,将b视作1,以此类推,z视作25。那么,字符串zard对应的26进制数为25×263+ 0×262+ 17*261+ 3×260=439845,其对139的取模后结果为49。而字符串zerd对应的26进制数为25×263+4×262+17×261+3×260= 442549,其对139的取模后结果为112。字符串wib对应的26进制数为22×262+ 8×261+ 1×260= 15081,其对123取模后结果为75
这一题定义int的数组,但计算量大所以可以转换为long long 。
如:ans =(long long)(a * b)% p * c % p * d。这样无论a, b,c,d有多大,ans都在p之内
T3
倍数问题
3.1
题目描述
小W喜欢研究k的倍数!具体来说,小W现在手上有一个数字k,他对k这个数字非常喜爱。爱屋及乌,于是小W也想研究一下k的倍数。与小W不同的是,小E的桌子上摆着n堆硬币,第i堆硬币有ai个。小E此时正在冥思苦想,想要尝试利用这n堆硬币设计一些游戏或者问题。小W看着他的n堆硬币,想到了一个问题:有多少对硬币堆满足它们两堆硬币合在一起后,硬币的个数是k的倍数呢?小W想了很久还是不会做这个问题,但是他又不想问小E,因为会被小E嘲讽。所以他只能向你求助了。
3.2
输入格式
输入的第一行为两个正整数n, k,含义如题目所示。
第二行为n个正整数a1, a2,···, an,含义如题目所示。
3.3
输出格式
输出一行一个非负整数,表示有多少对硬币堆满足其硬币数量之和为k的倍数。
3.4样例
13.4.1
样例输入
5 3
1 2 3 4 5
3.4.2
样例输出
4
3.4.3
样例解释
下以
(i, j)表示选择了第i堆和第j堆硬币拼在一起。拼出了3的倍数有:(1,2),(2,4),(4,5),(1,5
一开始以为是dfs,卡了很久,结果不是;
其实如果这个收据偏小。这会很简单
直接暴力
for( int i=0;i { for(int j=0;j
{ if((a[i]+a[j])%k==0)//注意if里要用“==” { ans++; } 但是你看!!! 对于所有数据,保证1≤n≤2×10^5,1≤ai≤10^9,1≤k≤10^5 不够用怎么办?用桶! #include int n,k; int main() 要注意k==2和k%2==0的情况
using namespace std;
long long a[1100000],ans=0,bik[1100000],d=0,f=0;
{
cin >> n >>k;
for(int i=0;i
cin >> a[i];
}
for(int i=0;i
bik[a[i]%k]++;
}
if(k==2)
{
ans+=bik[1]*(bik[1]-1)/2;
}
else
{
for(int i=1;i<=(k-1)/2;i++)
{
ans+=(bik[i]*bik[k-i]);
}
if(k%2==0)
{
f=bik[k/2]*(bik[k/2]-1)/2;
}
}
d=bik[0]*(bik[0]-1)/2;
cout << ans+d+f;
return 0;
}



