以下所有AC题解程序来自“仙客传奇”团队。
AC的C++语言程序:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
ll f(ll a,ll q)
{
ll ret=a;
while(--a)
{
ret*=a;
ret%=q;
}
ret%=q;
return ret;
}
int main()
{
ll n,k,q;
int T,kase=0;
cin>>T;
while(T--)
{
cin>>n>>k>>q;
if(n<=k+1)
{
cout<<"Case #"<<++kase<<": "<<f(n,q)<<endl;
}
else
{
ll num=2*f(k+1,q)%q+f(k,q)%q;
num%=q;
ll a=2*f(k,q)%q;
ll b=3*f(k,q)%q+f(k+1,q);
while(n>k+2)
{
num+=b;
num%=q;
b+=a;
b%=q;
n--;
}
cout<<"Case #"<<++kase<<": "<<num<<endl;
}
}
return 0;
}
AC的C++语言程序:
#include <iostream>
using namespace std;
typedef long long LL;
LL dp[51];
int main(void) {
int t;
LL n, k, q;
scanf("%d", &t);
for (int v = 1; v <= t; v++) {
scanf("%lld%lld%lld", &n, &k, &q);
if (k >= n - 1) {
LL ans = 1;
for (LL i = n; i >= 2; i--)
ans = ans * i % q;
printf("Case #%d: %lld\n", v, ans % q);
continue;
}
dp[1] = 1;
for (LL crse = 1, i = 2; i < 51; i++, crse += 2)
dp[i] = (dp[i - 1] + crse) % q;
LL ans = 1;
if (k == 1) ans = dp[n];
else {
for (LL i = k; i >= 2; i--)
ans = ans * i % q;
ans = ans * (dp[n - k] + (k + 1) * (n - k) % q - 1) % q;
}
printf("Case #%d: %lld\n", v, ans % q);
}
return 0;
}
AC的C++语言程序:
#include<iostream>
using namespace std;
typedef long long ll;
ll dp[55][55];
ll get(int k,int mod)
{
int b = k;
ll res = 1;
while(b)
{
res = (res * b) % mod;
b--;
}
return res;
}
int main()
{
int t,n,k,q;//
dp[1][1] = dp[1][0] = 1;
cin>>t;
for(int test = 1;test <= t;++test)
{
cin>>n>>k>>q;
for(int i = 2;i <= n;++i)
dp[i][1] = (dp[i - 1][1] + 2 * i - 3) % q;
if(k > n - 1) k = n - 1;
dp[n][k] = (get(k,q) * (dp[n - k][1] + (k + 1) * (n - k) % q - 1) % q) % q;
cout<<"Case #"<<test<<": "<<dp[n][k]<<endl;
}
return 0;
}
F. Counting Sheep in Ami Dongsuo
G. Best ACMer Solves the Hardest Problem
AC的C++语言程序:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxv = 1e7 + 10;
const int maxn = 6006;
int n, m;
typedef pair<int, int> pp;
vector<pp >v[maxv],cc;
int mp[maxn][maxn];
ll lastans;
int poww[maxv];
set<pair<int,int> >cnt;
set<pair<int,int> >::iterator it;
int dir[4][2]= {{1, 1}, {1, -1}, {-1, 1}, {-1, -1}};
void init() {
for(int i = 0; i <= 6000; i++) {
for(int j = 0; j <= 6000; j++) {
if(i * i + j * j <= 1e7) {
v[i * i + j * j].push_back(make_pair(i, j));
} else
continue;
}
}
}
int judge(int x,int y) {
if(x <= 0 || y <= 0 || x > 6000 || y > 6000)
return 0;
return 1;
}
int main() {
init();
int t;
scanf("%d", &t);
for(int cas = 1; cas <= t; cas++) {
cc.clear();
printf("Case #%d:\n", cas);
lastans = 0;
scanf("%d %d", &n, &m);
for(int i = 1; i <= n; i++) {
int x, y, w;
scanf("%d %d %d", &x, &y, &w);
mp[x][y] = w;
cc.push_back(make_pair(x, y));
}
for(int qq = 1; qq <= m; qq++) {
int op, x, y, w, k;
scanf("%d", &op);
if(op == 1) {
scanf("%d %d %d", &x, &y, &w);
x = (x + lastans) % 6000 + 1;
y = (y + lastans) % 6000 + 1;
mp[x][y] = w;
cc.push_back(make_pair(x, y));
} else if(op == 2) {
scanf("%d %d", &x, &y);
x = (x + lastans) % 6000 + 1;
y = (y + lastans) % 6000 + 1;
mp[x][y] = 0;
} else if(op == 3) {
scanf("%d %d %d %d",&x, &y, &k, &w);
x = (x + lastans) % 6000 + 1;
y = (y + lastans) % 6000 + 1;
cnt.clear();
for(int i = 0; i < v[k].size(); i++) {
int xx = v[k][i].first;
int yy = v[k][i].second;
for(int j = 0; j <= 3; j++) {
int nx = xx * dir[j][0] + x;
int ny = yy * dir[j][1] + y;
if(judge(nx, ny) && mp[nx][ny] != 0) {
cnt.insert(make_pair(nx, ny));
}
}
}
for(set<pp> :: iterator it = cnt.begin(); it != cnt.end(); it++) {
mp[it -> first][it -> second] += w;
}
} else {
scanf("%d %d %d", &x, &y, &k);
x = (x + lastans) % 6000 + 1;
y = (y + lastans) % 6000 + 1;
cnt.clear();
for(int i = 0; i < v[k].size(); i++) {
int xx = v[k][i].first;
int yy = v[k][i].second;
for(int j = 0; j <= 3; j++) {
int nx = xx * dir[j][0] + x;
int ny = yy * dir[j][1] + y;
if(judge(nx, ny) && mp[nx][ny] != -1) {
cnt.insert(make_pair(nx, ny));
}
}
}
ll ans = 0;
for(set<pp>::iterator it = cnt.begin(); it != cnt.end(); it++) {
ans += mp[it ->first][it->second];
}
lastans=ans;
printf("%lld\n",ans);
}
}
for(int i = 0; i < cc.size(); i++) {
mp[cc[i].first][cc[i].second] = 0;
}
}
return 0;
}
AC的C++语言程序:
#include <iostream>
#include <cstring>
#include <cmath>
#include <vector>
#include <map>
#include <set>
using namespace std;
typedef long long LL;
const int LIM = 6010;
const int SIZE = 10000001;
int wei[LIM][LIM];
int valid[LIM][LIM];
vector<pair<int, int>> crease[SIZE];
int dir[2][4] = {1, 1, -1, -1, 1, -1, 1, -1};
// 不要每次都memset会超时
int main(void) {
LL lastAns;
int t, n, m, x, y, w, op, k, cur, nx, ny;
scanf("%d", &t);
for (int i = 0; i <= 6000; i++)
for (int j = 0; j <= 6000; j++)
if ((cur = i * i + j * j) < SIZE)
crease[cur].push_back(make_pair(i, j));
for (int v = 1; v <= t; v++) {
// init
printf("Case #%d:\n", v);
lastAns = 0;
scanf("%d%d", &n, &m);
for (int i = 0; i < n; i++) {
scanf("%d%d%d", &x, &y, &w);
wei[x][y] = w;
valid[x][y] = v;
}
set<int> vis;
while (m--) {
scanf("%d%d%d", &op, &x, &y);
x = (x + lastAns) % 6000 + 1;
y = (y + lastAns) % 6000 + 1;
switch (op) {
case 1:
scanf("%d", &w);
wei[x][y] = w;
valid[x][y] = v;
break;
case 2:
valid[x][y] = 0;
break;
case 3:
vis.clear();
scanf("%d%d", &k, &w);
for (auto ite : crease[k]) {
for (int i = 0; i < 4; i++) {
nx = x + ite.first * dir[0][i];
ny = y + ite.second * dir[1][i];
if (nx >= 0 && nx <= 6000 && ny >= 0 && ny <= 6000
&& valid[nx][ny] == v && !vis.count(cur = nx * 6001 + ny))
wei[nx][ny] += w, vis.insert(cur);
}
}
break;
case 4:
vis.clear();
scanf("%d", &k);
LL ans = 0;
for (auto ite : crease[k]) {
for (int i = 0; i < 4; i++) {
nx = x + ite.first * dir[0][i];
ny = y + ite.second * dir[1][i];
// printf("x = %d, y = %d\n", nx, ny);
if (nx >= 0 && nx <= 6000 && ny >= 0 && ny <= 6000
&& valid[nx][ny] == v && !vis.count(cur = nx * 6001 + ny))
ans += wei[nx][ny], vis.insert(cur);
}
}
lastAns = ans;
printf("%lld\n", ans);
break;
}
}
}
return 0;
}
I. Distance Between Sweethearts
J. How Much Memory Your Code Is Using?
AC的C++语言程序:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
using namespace std;
int main(){
int n,t;
// freopen("memory your code is using.txt","r",stdin);
string name,typ;
ios::sync_with_stdio(false);
cin>>t;
for(int kase=1;kase<=t;++kase){
cin>>n;
// cout<<n<<endl;
long long men=0;
for(int i=0;i<n;++i){
cin>>typ;
cin>>name;
// cout<<typ<<endl<<name<<endl;
if(typ=="long"){
if(name=="long") typ="ll";
else if(name=="double") typ="ld";
cin>>name;
}
long long num=0;
for(int i=0;i<name.length();++i){
if(name[i]=='['){
++i;
while(name[i]>='0' && name[i]<='9')
num=num*10+name[i]-48,++i;
}
}
if(!num) num=1;
if(typ=="char" || typ=="bool")
men+=num*1;
else if(typ=="int" || typ=="float" )
men+=num*4;
else if(typ=="ll" || typ=="double")
men+=num*8;
else if(typ=="__int128" || typ=="ld")
men+=num*16;
}
men =!(men%1024) ? men/1024 : men/1024+1 ;
printf("Case #%d: %d\n",kase,men);
}
}
AC的C++语言程序:
#include <iostream>
#include <string>
using namespace std;
typedef long long LL;
/*
int
bool
char
float
double
__int128
long double
long long
*
*/
inline int getCnt(const string &s) {
int i = 0;
for (; i < s.size() && s[i] != '['; i++);
if (i == s.size()) return 1;
int ret = 0;
for (i++; i < s.size() && s[i] != ']'; i++) {
ret = ret * 10 + s[i] - '0';
}
return ret;
}
int main(void) {
ios::sync_with_stdio(false);
cin.tie(NULL);
string str, var;
int n, t, cnt;
cin >> t;
for (int k = 1; k <= t; k++) {
cin >> n;
LL ans = 0;
while (n--) {
cin >> str;
if (str == "long") {
cin >> str >> var;
cnt = getCnt(var);
switch (str[0]) {
case 'l':
ans += cnt * 8;
break;
case 'd':
ans += cnt * 16;
break;
}
} else {
cin >> var;
cnt = getCnt(var);
switch (str[0]) {
case 'i':
ans += 4 * cnt;
break;
case 'b':
ans += cnt;
break;
case 'c':
ans += cnt;
break;
case 'f':
ans += 4 * cnt;
break;
case 'd':
ans += 8 * cnt;
break;
case '_':
ans += 16 * cnt;
break;
}
}
}
cout << "Case #" << k << ": " << (ans + 1023) / 1024 << '\n';
}
return 0;
}
AC的C++语言程序:
#include<bits/stdc++.h>
using namespace std;
int main() {
int kase = 0;
int T;
cin >> T;
while( T-- ) {
int n;
int ans = 0;
int num;
cin >> n;
getchar();
for(int i = 0; i < n; i++) {
string s;
int tmp;
getline(cin, s);
//cout<<s<<endl
string str = s;
if(s[0] == 'b') tmp = 1;
else if(s[0] == 'c') tmp = 1;
else if(s[0] == 'i') tmp = 4;
else if(s[0] == 'd') tmp = 8;
else if(s[0] == 'f') tmp = 4;
else if(s[0] == '_') tmp = 16;
else if(s[0] == 'l') {
if(s[5]=='l')tmp=8;
else if(s[5]=='d')tmp=16;
}
int loc1 = str.find("[");
num = 0;
if(loc1 != -1) {
int loc2 = str.find("]");
for(int i = loc1 + 1; i < loc2; i++) {
num = num * 10 + s[i] - '0';
}
}
if(num) tmp *= num;
ans += tmp;
}
ans = ceil((double)ans/1024);
cout << "Case #" << ++kase << ": " << ans << endl;
}
return 0;
}
AC的C++语言程序:
#include<bits/stdc++.h>
using namespace std;
map<string,int> mp;
inline void init(){
mp.insert(make_pair("bool",1));
mp.insert(make_pair("char",1));
mp.insert(make_pair("int",4));
mp.insert(make_pair("float",4));
mp.insert(make_pair("long long",8));
mp.insert(make_pair("double",8));
mp.insert(make_pair("long double",16));
mp.insert(make_pair("__int128",16));
}
int main(){
// freopen("in.txt","r",stdin);
int T;
// ios::sync_with_stdio(false);
cin>>T;
init();
for(int cs=1;cs<=T;cs++){
int n;
cin>>n;
cin.ignore();
string s;
long long sum=0;
while(n--){
getline(cin,s);
int id=s.find_last_of(" ");
string ss=s.substr(0,id);
if((id=s.find('['))!=string::npos){
string sss=s.substr(id+1);
long long num=0;
for(int i=0;sss[i]!=']';i++){
num=num*10+sss[i]-'0';
}
sum+=num*mp[ss];
}else{
sum+=mp[ss];
}
}
cout<<"Case #"<<cs<<": "<<(sum-1)/1024+1<<endl;
}
return 0;
}
AC的C++语言程序:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
using namespace std;
const int tran=1024;
int f(string str)
{
int len=str.size();
int flag=0;
int j,s_num=0;
for(int i=0;i<len;i++)
{
if(str[i]==';') break;
if(str[i]=='['){
flag=1;
for(j=i+1;;j++){
if(str[j]==']') break;
s_num=s_num*10+str[j]-'0';
}
i=j+1;
}
}
if(!flag) return 1;
else
return s_num;
}
int main()
{
int t,cnt=0,n;
scanf("%d",&t);
string str;
while(t--)
{
scanf("%d",&n);
getchar();
long long num=0;//字节
while(n--)
{
getline(cin,str);
int len=str.size();
if(str[0]=='b'||str[0]=='c')//bool 一字节
{
num+=f(str);
}
else if(str[0]=='i'||str[0]=='f')
{
num+=4*f(str);
// cout<<num<<endl;
}
else if(str[0]=='d'){
num+=8*f(str);
}
else if(str[0]=='_'){
num+=16*f(str);
}
else if(str[0]=='l')
{
if(str[5]=='d'){//long double 想用 substr 判断double 结果不对emm
num+=16*f(str);
}
else{
num+=8*f(str);
}
}
//cout<<num<<endl;
}
//cout<<num<<endl;
int ans;
if(num%tran==0) ans=num/tran;
else ans=1+num/tran;
printf("Case #%d: %d\n",++cnt,ans);
}
return 0;
}
AC的C++语言程序:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
int main()
{
int T,kase=0;
ll n,m,k;
scanf("%lld",&T);
while(T--)
{
scanf("%lld%lld%lld",&n,&m,&k);
printf("Case #%d: ",++kase);
if(n==1)
{
printf("1\n");
continue;
}
if(k==1)
{
printf("%lld\n",m);
continue;
}
ll sum=n-m+1;
ll ans=(sum+k-1)%sum;
while(sum<n)
{
if(m>k)
{
ll t=sum-ans;
t/=k;
t=min(n-sum,t);
sum+=t;
ans=(ans+t*k)%sum;
if(sum==n) break;
}
sum++;
ans=(ans+k)%sum;
if(sum==n) break;
//cout<<sum<<endl;
}
printf("%lld\n",ans+1);
}
return 0;
}
AC的C++语言程序:
#include <iostream>
#include <cmath>
using namespace std;
typedef long long LL;
// m小直接推,k小按k推,一圈都转不完不用推
int main(void) {
LL n, m, k;
int t;
scanf("%d", &t);
for (int w = 1; w <= t; w++) {
scanf("%lld%lld%lld", &n, &m, &k);
if (k == 1) {
printf("Case #%d: %lld\n", w, m * k);
continue;
}
LL tn, tm, fcrt;
tn = n - m + 1, tm = 1;
fcrt = (k - 1) % tn;
if (m > k) {
LL t;
while (tm < m) {
t = min((tn - fcrt) / k + 1, m - tm);
// printf("tm = %lld, tn = %lld, (tn - fcrt) / k + 1 = %lld, m - tm = %lld, t is %lld\n", tm, tn, (tn - fcrt) / k + 1, m - tm, t);
tm += t, tn += t;
fcrt = (fcrt + t * k) % tn;
}
fcrt++;
} else {
while (tm < m) {
tn++, tm++;
fcrt = (fcrt + k) % tn;
}
fcrt++;
}
printf("Case #%d: %lld\n", w, fcrt);
}
return 0;
}