补题*总结题21/9/14
B - Unexpressed
G - A ^ B ^ C AtCoder - arc113_b (找规律)
题意:
给定三个数A,B,C,求出 a ^b ^c的个位上的数。
思路
-
只需求解个位上数,所以A的个位以上的数对结果无影响,所以我们对A取余。
-
找规律,我们发现0-9中每个数的n次方的个位上的数是具有规律性的,结果如下:
-
利用快速幂计算,对a所在周期取余的结果
-
在记录a的n次幂的个位的数组中输出结果。
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define INF 0x7fffffff
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
int abc[10][5];
ll pm(ll b,ll c,ll mod)
{
ll res = 1;
while(c)
{
if(c & 1)
{
(res *= b)%= mod;
}
c >>= 1;
(b*=b)%= mod;
}
return res;
}
int main()
{
IOS;
int a,b,c;
abc[2][0] = 6;abc[2][1] = 2;abc[2][2] = 4;abc[2][3] = 8;
abc[3][0] = 1;abc[3][1] = 3;abc[3][2] = 9;abc[3][3] = 7;
abc[4][0] = 6;abc[4][1] = 4;
abc[7][0] = 1;abc[7][1] = 7;abc[7][2] = 9;abc[7][3] = 3;
abc[8][0] = 6;abc[8][1] = 8;abc[8][2] = 4;abc[8][3] = 2;
abc[9][0] = 1;abc[9][1] = 9;
cin >>a>>b>>c;
a=a%10;
if(a ==0||a==1||a ==5||a ==6)
{
cout<<a<<endl;
}
else
{
if(a ==4 ||a==9)
{
ll bc=pm(b,c,2);//两个数循环
cout<<abc[a][bc]<<endl;
}
else
{
ll bc=pm(b,c,4);//四个数循环
cout<<abc[a][bc]<<endl;
}
}
system("pause");
return 0;
}
H - String Invasion AtCoder - arc113_c
题意:
给定字符串s
在S中选择三个连续的字符,
使得 s i = s i + 1 ≠ s i + 2 ,将 s i + 2 替换为 s i 。
求最多替换的次数。
思路:
- 从后往前遍历字符串,记录各字符的出现次数。
- 当到符合题意位置q时,
-
- 让结果加上s[q]后面字符串的长度,
-
- 再减去s[q]在后面的字符串中的出现次数(相同的字符不用修改)。
- 因为后面的字符串已经被改动,
-
- 所以要重置记录字符出现次数的数组。
-
- 并且将s[q] 的出现次数改为:后面字符串的长度。
- 循环进行上述过程,直到字符串全都遍历。
代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int cnt[30];
int main()
{
memset(cnt,0,sizeof cnt);
string s;
cin>>s;
int len = s.length();
ll ans=0;
cnt[s[len-1]-'a']++;
cnt[s[len-2]-'a']++;
for(int i = len-3;i >= 0;i--)
{
if(s[i]==s[i+1]&&s[i+1]!=s[i+2])
{
ans+=len-(i+1)-cnt[s[i]-'a' ];
memset(cnt,0,sizeof cnt);
cnt[s[i]-'a'] = len-(i+1);
}
cnt[s[i]-'a']++;
}
cout<<ans<<endl;
return 0;
}