题意:给个N,求是否%73和%137 都等于0。 题解:the length of N is up to 10000000,题目不看清楚的话就gg,%73和%137都等于0,就是说%10001等于0。由于N是字符串,我们要寻找10001倍数的规律,明显从字符串最后往前遍历,如果有i位置字符不为’0’,那么它前第4位(i-4)i-4,肯定有i位置的数在,【如:1100011,30003,50005】.然后我们进一步思考,【如:100020001】这种情况,中间有重叠,我们自然得想,遇到最后一位的’1’,找其前第4位,把’2’-‘1’,自身变成’0’,变为100010000,再遍历遇到第5位的’1’,同样操作。然后我们再进一步思考,【如:100100009】的情况,我们需要减去’9’的时候往前借一位。再思考【1000089999】的情况,我们需要在减法时一直往前借。
#include<cstdio> #include<cstring> #include<cmath> #include<vector> #include<queue> #include<stack> #include<map> #include<algorithm> #include<string> using namespace std; const int N=10001000; #define ll long long #define mod 10000007 int n,m; char s[N]; int main() { int k = 1; while(~scanf("%s",s)) { printf("Case #%d: ",k++); int len = strlen(s); if(s[0] == '0' && len == 1) { printf("YES\n"); continue; } int flag = 0; for(int i = len-1; i >= 4; i--) { if(s[i] != '0') { if(s[i-4] >= s[i]) { s[i-4] = s[i-4] - (s[i]-'0'); s[i] = '0'; } else { s[i-4] = s[i-4]+10-(s[i]-'0'); s[i] = '0'; s[i-5]--; } } } for(int i = 0; i < len; i++) { if(s[i] != '0') flag = 1; } if(flag == 1) printf("NO\n"); else printf("YES\n"); } return 0; }