题意:
一个长度为n的字母串的数值为s [0]*31^( n -1) + s [1]*31^( n -2) + ... + s [n -1],其中s[i]为字母的ASCII码,数值用int表示
现在给你一个k(2-1000)要求你构造出k个数值相同的字母串,长度小于等于1000
思路:
可以看出对应的大小写字母差值为32,满足进位条件,即当前位置和下个位置原先为ss,现在我可以让当前位置+1,下一位置-31表示一个进位
这样所得的数值不会产生任何变化,这样每两位算一个,一共能表示999个数,最后一个数可以再随意找两个不同的位置转换一下就可以了
/* *********************************************** Author :devil ************************************************ */ #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <set> #include <stack> #include <map> #include <string> #include <time.h> #include <cmath> #include <stdlib.h> #define LL long long #define rep(i,a,b) for(int i=a;i<=b;i++) #define dep(i,a,b) for(int i=a;i>=b;i--) #define ou(a) printf("%d ",a) #define pb push_back #define mkp make_pair template<class T>inline void rd(T &x) { char c=getchar(); x=0; while(!isdigit(c))c=getchar(); while(isdigit(c)) { x=x*10+c-'0'; c=getchar(); } } #define IN freopen("in.txt","r",stdin); #define OUT freopen("out.txt","w",stdout); using namespace std; const int inf=0x3f3f3f3f; const int mod=1e9+7; const int N=1e3+10; char s[N][N]; int main() { #ifndef ONLINE_JUDGE //IN #endif freopen("hash.in","r",stdin); freopen("hash.out","w",stdout); int k; scanf("%d",&k); for(int i=0;i<1000;i++) s[0][i]='s',printf("s"); s[0][1000]='