原题链接: https://codeforces.com/problemset/problem/1165/A
样例:
Input11 5 211010100101Output1Input11 5 111010100101Output3
题意: 给你一个二进制字符串,你可以进行修改操作。你需要使这个二进制字符串的值对于给定的xxx和yyy对10×10^x10x取模之后的值为10y10^y10y,问你最少需要进行多少次修改操作。
解题思路: 这个题目我们不能真的去取模,而是分析一下对10×10^x10x取模余下的是什么,什么会被消去。即把10×10^x10x也展成二进制字符串,那么不小于第x+1x+1x+1位的全部都会被消去,而剩下的就是在低于第x+1x+1x+1的二进制,而我们如果想得到最后的值为10y10^y10y,即剩余的二进制字符串要与10y10^y10y的二进制字符串相同,故我们统计我们要修改的即可。
AC代码:
/**邮箱:unique_powerhouse@qq.com*blog:https://me.csdn.net/hzf0701*注:文章若有任何问题请私信我或评论区留言,谢谢支持。**/#include<bits/stdc++.h> //POJ不支持#define rep(i,a,n) for (int i=a;i<=n;i++)//i为循环变量,a为初始值,n为界限值,递增#define per(i,a,n) for (int i=a;i>=n;i--)//i为循环变量, a为初始值,n为界限值,递减。#define pb push_back#define IOS ios::sync_with_stdio(false);cin.tie(0); cout.tie(0)#define fi first#define se second#define mp make_pairusing namespace std;const int inf = 0x3f3f3f3f;//无穷大const int maxn = 1e5;//最大值。typedef long long ll;typedef long double ld;typedef pair<ll, ll> pll;typedef pair<int, int> pii;//*******************************分割线,以上为自定义代码模板***************************************//int main(){//freopen(\"in.txt\", \"r\", stdin);//提交的时候要注释掉IOS;int n,x,y;string str;while(cin>>n>>x>>y){cin>>str;int sum=0;if(str[n-y-1]!=\'1\')sum++;for(int i=n-1;i>n-x-1;i--){if(i!=n-y-1){if(str[i]!=\'0\')sum++;}}cout<<sum<<endl;}return 0;}