华东交通大学2018年ACM“双基”程序设计竞赛

代码头多的都是标答Ctrl+c下来的,给自己挖个坟,回头有时间再填回去,不填回去就死在这里吧……

传送门:https://ac.nowcoder.com/acm/contest/221#question

目录

华东交通大学2018年ACM“双基”程序设计竞赛

A.ecjtuacm

B.公式题(1)

C.公式题(2)

D.俺は人间をやめるぞ!

E.Max Power

F.炉石传说

G.7的意志

H.梦中的勇士

I.数学题

J.死肥宅的冲分计划

K.MIKU酱的氪金宝典


A.ecjtuacm

题目描述:
为了给acm打劲,我们喊出"ecjtu"后,你要喊出"ecjtuacm"。

输入描述:
一行字符串"ecjtu"。
输出描述:
在一行中输出"ecjtuacm"(要换行)。
示例1
输入
ecjtu
输出
ecjtuacm

#include<iostream>
using namespace std;
int main()
{string a;cin >> a;cout <<a<<"acm"<< endl;return 0;
}

B.公式题(1)

题目描述
令f(n)=2f(n-1)+3f(n-2)+n,f(1)=1,f[2]=2。
告诉你n,输出f(n)的结果,结果对1e9+7取模。
输入描述:
多组输入,每行一个整数n(1<=n<=1000),如果输入为0,停止程序。
输出描述:
输出对应g(n)的值,结果对1e9+7取模。
示例1
输入
1
5
9
456
0
输出
1
95
7789
734891569

矩阵快速幂模板题,但数据量小可以打表。

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int main()
{long long MOD=1e9+7;long long ans[1008]={0,1,2};for(int i=3;i<1001;i++){ans[i]=(ans[i-1]*2)+(long long)i+(ans[i-2]*3);ans[i]=ans[i]%MOD;}int n;while(scanf("%d",&n)&&n){cout<<ans[n]<<endl;}return 0;
} 

C.公式题(2)

题目描述
令f(n)=2f(n-1)+3f(n-2)+n,f(1)=1,f(2)=2
令g(n)=g(n-1)+f(n)+n*n,g(1)=2
告诉你n,输出g(n)的结果,结果对1e9+7取模

输入描述:
多组输入,每行一个整数n(1<=n<=1e9),如果输入为0,停止程序。
输出描述:
在一行中输出对应g(n)的值,结果对1e9+7取模。
示例1
输入
1
5
9
456
0
输出
2
193
11956
634021561

思路:快速幂,方程:g(n)=g(n-1)+2f(n-1)+3f(n-2)+(n-1)²+3(n-1)+2。

#include<iostream>
#include<cstring>
#include<cstdio>
#define ll long long
#define MOD 1000000007
using namespace std;
ll ans[6][6],b[6][6];
void mul(ll a[][6],ll t[][6])
{ll c[6][6];memset(c,0,sizeof(c));for(int i=0;i<6;i++)for(int j=0;j<6;j++)for(int k=0;k<6;k++)c[i][j]+=(a[i][k]*t[k][j])%MOD;for(int i=0;i<6;i++)for(int j=0;j<6;j++)a[i][j]=c[i][j]%MOD;
}
void pre()
{memset(ans,0,sizeof(ans));memset(b,0,sizeof(b));ans[0][0]=8;ans[0][1]=2;ans[0][2]=1;ans[0][3]=4;ans[0][4]=2;ans[0][5]=1;b[0][0]=1;b[1][0]=2;b[2][0]=3;b[3][0]=1;b[4][0]=3;b[5][0]=2;b[1][1]=2;b[2][1]=3;b[4][1]=1;b[5][1]=1;b[1][2]=1;b[3][3]=1;b[4][3]=2;b[5][3]=1;b[4][4]=1;b[5][4]=1;b[5][5]=1;
}
int main()
{int n;while(scanf("%lld",&n)&&n){pre();if(n==1) ans[0][0]=2;elsefor(n-=2;n;n>>=1){if(n&1) mul(ans,b);mul(b,b);}cout<<ans[0][0]<<endl;}return 0;
}

D.俺は人间をやめるぞ!

题目描述
摸鱼之王MIKU酱想去埃及玩,需要一个人陪同。小新和小磊都想陪MIKU酱一起去,但名额只有一个。所以小磊和小新决定用一个小游戏来决定谁和MIKU酱出去玩。
游戏的道具是21张塔罗牌,塔罗牌分为大牌和小牌,其中大牌有22张,分别是编号为0的愚者(The Fool)和编号为21的世界(The World)。
给出22张的塔罗牌以及其编号如下:
【0】愚者(The Fool,0)
【1】魔术师(The Magician,I)
【2】女祭司(The High Priestess,II)
【3】皇后(The Empress,III)
【4】皇帝(The Emperor,IV)
【5】教皇(The Hierophant,or the Pope,V)
【6】恋人(The Lovers,VI)
【7】战车(The Chariot,VII)
【8】力量(Strength,VIII)
【9】隐士(The Hermit,IX)
【10】命运之轮(The Wheel of Fate,X)
【11】正义(Justice,XI)
【12】倒吊人(The Hanged Man,XII)
【13】死神(Death,XIII)
【14】节欲(Temperance,XIV)
【15】恶鬼(The Devil ,XV)
【16】塔(The Tower,XVI)
【17】星辰(The Star,XVII)
【18】月亮(The Moon,XVIII)
【19】太阳(The Sun,XIX)
【20】审判(Judgement,XX)
【21】世界(The World,XXI)
游戏的规则是:将22张塔罗牌打乱,然后分别从中翻开一张卡,两张卡的权值和如果为正数,则小新获胜,如果为负数,则小磊获胜。如果这张卡是正位(即是正向的),那么这张牌的权值就为他的序号,如果是逆位(反向),则权值就为序号的相反数。例如:正位的世界的权值为21,逆位的死神的权值为 -13。因为愚者的正逆位都是0,为了让游戏更有趣,他们附加了一条规则:如果翻出了正位的愚者,那么直接判定小新获胜,如果出现了逆位的愚者,那么小磊获胜。
大家都不知道,小磊其实具有将时间暂停几十秒的能力。但是小磊并不想用这个能力作弊,他只想在小新翻开牌的瞬间看看他翻到的是什么牌,然后计算自己可能获胜的几率。
输入描述:
多组输入,输入一个数字a(0<=a<=21)和一个数字b(0<=b<=1),a代表小新翻出来的牌的序号,b代表小新翻出卡的位序,b为0则为逆位,为1则为正位,如果输入为"-1 -1",终止输入。
输出描述:
输出格式为:a/b 该分式为最简式。中间的杠为字符“/”。如果结果为0,则输出“owatta”。如果已经获胜(小新的牌为逆位愚者)则输出“1”。
示例1
输入
0 1
输出
owatta

水题,模拟一下就行。

#include<iostream>
#include<cstring>
#include<stdio.h>
using namespace std;
int gcd(int a,int b)
{return b?gcd(b,a%b):a;
}
int main()
{int a,b=42;int num,fh;while(scanf("%d%d",&num,&fh)&&(num!=-1||fh!=-1)){if(fh==0)  num=-num;a=0;if(num!=0){for(int i=-21;i<22;i++){if(i!=num&&i!=(-num)){if(i==0&&num<0) a++;if(i+num>0) a++;}}a=42-a;int x=gcd(a,b);printf("%d/%d\n",a/x,b/x);}else{if(fh==0) cout<<"1"<<endl;else cout<<"owatta"<<endl;}}return 0;
} 

E.Max Power

题目描述

小卤蛋刚把dnf的技能点重新洗了一遍,现在他要重新加点,假设他的技能树一共有n层,第i层有n-i+1个
技能,每个技能只能够学习一次。除了第1层的技能可以直接学习外,其他技能学习都要学习前置技能,
即你要学习第i(i>=2)层第j列的技能,那么你要先学习第i-1层的第j列和第j+1列的技能。每个技能学习
后都会获得一定的战力加成。
现在小卤蛋有m个技能点,一个技能点可以学习一个技能,他想知道加完点后他可以获得的最大战力加成为多少。

输入描述:

有多组样例输入,输入到文件结束.
每组样例第一行输入2个整数n(1<=n<=50)和m(1<=m<=1300),对应题目上的含义。
接下来共有n行,第i行有n-i+1个数,代表这个技能学习后获得的战力加成(战力加成<=1000)。

输出描述:

输出最大的战力加成。

输入

4 3
1 4 1 9
2 3 5
6 1
66

输出

15
#include<iostream>
#include<algorithm>
#include<cstring>
#include<iomanip>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
using namespace std;int a[55][55],t[55],dp[55][55][1305];
int main()
{int n,m;while(cin>>n>>m){for(int i=1;i<=n;i++){for(int j=1;j<=n-i+1;j++){cin>>a[i][j];a[i][j]+=a[i-1][j];}}memset(dp,0,sizeof(dp));for(int i=1;i<=n;i++){t[i]=t[i-1]+i;}int ans=0;for(int i=n;i>=1;i--){for(int j=0;j<=n-i+1;j++){for(int k=t[j];k<=m;k++){for(int p=max(0,j-1);p<=n-i+1;p++){dp[i][j][k]=max(dp[i][j][k],dp[i+1][p][k-j]+a[j][i]);}}ans=max(ans,dp[i][j][m]);}}cout<<ans<<endl;}
}

F.炉石传说

题目描述

炉石传说是一款非常丢人的氪金游戏(卡牌游戏),现在要求你在一定程度上还原对局中的场景。
每个玩家都有随从,随从会在你面前一字排开,为了简化情况,本题只需要讨论你的随从,随从都具有攻击力与当前生命值和最大生命值,如果随从的当前生命值小于等于0,该随从死亡,且光环失效,该随从从队列中消失,随从的当前生命值无法超过最大生命值,有的随从会具有攻击光环和生命光环(光环提供给除自己以外所有随从),光环可以无限制叠加,以下是光环描述:
光环叠加:光环之间互相独立计算
得到攻击光环:得到对应数量的攻击力
得到生命光环:得到对应数量的最大生命值和当前生命值
失去攻击光环:失去对应数量的攻击力
失去生命光环:失去对应数量的最大生命值,当前生命值不会下降,但会受到最大生命值的影响
现在用事件来描述场景:
事件1:
随从入场,一行中输入五个正整数,分别表示随从攻击力,随从血量,攻击光环数值,生命光环数值,入场位置(表示从左到右数的第几个位置,如果该位置已有随从,则插到这个随从左边)
事件2:
计算你的全体随从攻击力之和,无额外描述
事件3:
对一个随从造成伤害,一行中输入两个正整数,分别表示伤害额度和随从位置(表示从左到右数的第几个随从)
事件4;
使一个随从的光环失效,但该随从依旧享受其他随从的光环,一行中输入一个正整数,表示随从位置(表示从左到右数的第几个随从)
事件5:

对所有随从造成伤害,一行中输入一个正整数,表示伤害额度

事件1到5对应输入描述中的事件序号

事件2中在一行里输出攻击力总和,其他事件不需要输出。

本题的所有数字范围都在1到1000以内,本题保证事件1,3,4描述的位置合法

输入描述:

第一行一个正整数T(1<=T<=100)表示样例个数,每个样例第一行一个正整数Q(1<=Q<=1000),表示你要处理的事件个数,然后Q个事件,每个事件在第一行输入一个数字,代表发生的事件序号,同一行描述事件(如果事件有描述),事件描述中出现的数字范围都在1到1000以内。

输出描述:

每当事件2发生时,在一行中输出攻击力之和。

输入

3
3
2
1 5 5 5 5 1
2
5
1 5 5 5 5 1
1 4 4 5 5 1
2
5 9
2
6
1 5 5 5 5 1
2
1 5 5 5 5 1
2
1 5 5 5 5 1
2

输出

0
5
19
5
5
20
45

说明

第一个样例里,随从变化为:无->(5/5)第二个样例里,随从变化为:无->(5/5)->(9/9,10/10)->(5/1)第三个样例里,随从变化为:无->(5/5)->(10/10,10/10)->(15/15,15/15,15/15)

备注:

你一开始没有任何随从
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<stack>
#include<map>
#include<vector>
#include<queue>
#include<set>
#include<iomanip>
#include<cctype>
#include<ctime>
using namespace std;
typedef long long ll;
#define edl putchar('\n')
#define sscc ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define FOR(i,a,b) for(int i=a;i<=b;i++)
#define ROF(i,a,b) for(int i=a;i>=b;i--)
#define FORLL(i,a,b) for(ll i=a;i<=b;i++)
#define ROFLL(i,a,b) for(ll i=a;i>=b;i--)
#define mst(a) memset(a,0,sizeof(a))
#define mstn(a,n) memset(a,n,sizeof(a))
#define zero(x)(((x)>0?(x):-(x))<eps)
#define si(a) scanf("%d",&a)
#define sl(a) scanf("%lld",&a)
#define sd(a) scanf("%lf",&a)
#define ss(a) scanf("%s",a)
inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
inline ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
int month[15]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int dir[8][2]={{-1,0},{1,0},{0,-1},{0,1},{-1,-1},{1,1},{1,-1},{-1,1}};
const int MAXN=1e3+5;
const int INF=1<<30;
const long long mod=1e9+7;
const double eps=1e-8;
const ll inff=0x3f3f3f3f3f3f3f3f;
struct num
{int att,heal,max,ar,hr;
}a[MAXN],t;
int n,m,T,Q,cnt,ar,hr,b[10];
int main()
{//freopen("D:\\a.txt","r",stdin);//freopen("D:\\b.txt","w",stdout);scanf("%d",&T);while(T--){cnt=0,ar=0,hr=0;scanf("%d",&Q);while(Q--){scanf("%d",&n);if(n==1)//入场 {FOR(i,1,5) scanf("%d",&b[i]);ar+=b[3],hr+=b[4];ROF(i,cnt+1,b[5]+1){a[i]=a[i-1];}cnt++;a[b[5]].att=b[1];a[b[5]].heal=b[2];a[b[5]].max=b[2];a[b[5]].ar=b[3];a[b[5]].hr=b[4];}else if(n==2)//统计 {int ans;if(cnt!=0){ans=ar*(cnt-1);FOR(i,1,cnt) ans+=a[i].att;}elseans=0;cout<<ans<<endl;}else if(n==3)//单体 {scanf("%d%d",&n,&m);a[m].heal-=n;if(a[m].heal+hr-a[m].hr<=0){t=a[m];FOR(i,m,cnt-1)a[i]=a[i+1];cnt--;ar-=t.ar,hr-=t.hr;FOR(i,1,cnt)a[i].heal=min(a[i].heal+t.hr,a[i].max);}}else if(n==4)//沉默 {scanf("%d",&n);ar-=a[n].ar,hr-=a[n].hr;FOR(i,1,cnt)if(i!=n)a[i].heal=min(a[i].heal+a[n].hr,a[i].max);a[n].ar=0,a[n].hr=0;}else//AOE {int vis[cnt+5],m=0,p;mst(vis);scanf("%d",&n);FOR(i,1,cnt){a[i].heal-=n;if(a[i].heal+hr-a[i].hr<=0){vis[i]=1;m+=a[i].hr;}}p=cnt;cnt=0;FOR(i,1,p)if(vis[i]==0){a[++cnt]=a[i];a[cnt].heal=min(a[i].heal+m,a[i].max);}else{hr-=a[i].hr;ar-=a[i].ar;}}}}//fclose(stdin);//fclose(stdout);
}

G.7的意志

题目描述
定义一个序列a:7,77,777…,7777777(数字全为7的正整数,且长度可以无限大)
clearlove7需要从含有7的意志的数里获得力量,如果一个整数能被序列a中的任意一个数字整除,并且其数位之和为序列a中任意一个数字的倍数,那么这个数字就含有7的意志,现在给你一个范围[n,m],问这个范围里有多少个数字含有7的意志。

输入描述:
多组输入,每行两个个整数n,m(1<=n<=m<=1e18),如果输入为"0 0",停止程序。
输出描述:
每一行输出含有7的意志的数的个数。
示例1
输入
1 7
1 100
1 1000
0 0
输出
1
3
21
说明
1到100中符合条件的数字为7,70,77

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<stack>
#include<map>
#include<vector>
#include<queue>
#include<set>
#include<iomanip>
#include<cctype>
#include<ctime>
using namespace std;
typedef long long ll;
#define edl putchar('\n')
#define sscc ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define FOR(i,a,b) for(int i=a;i<=b;i++)
#define ROF(i,a,b) for(int i=a;i>=b;i--)
#define FORLL(i,a,b) for(ll i=a;i<=b;i++)
#define ROFLL(i,a,b) for(ll i=a;i>=b;i--)
#define mst(a) memset(a,0,sizeof(a))
#define mstn(a,n) memset(a,n,sizeof(a))
#define zero(x)(((x)>0?(x):-(x))<eps)
#define si(a) scanf("%d",&a)
#define sl(a) scanf("%I64d",&a)
#define sd(a) scanf("%lf",&a)
#define ss(a) scanf("%s",a)
inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
inline ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
int month[15]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
const int MAXN=1e3+5;
const int INF=1<<30;
const long long mod=1e9+7;
const double eps=1e-8;
const ll inff=0x3f3f3f3f3f3f3f3f;
ll dp[25][185][8];
int a[25];
ll dfs(int pos,int sum,int m,int limit)
{if(pos==0)return m==0&&sum%7==0;if(!limit&&dp[pos][sum][m]!=-1){return dp[pos][sum][m];}int up=limit?a[pos]:9;ll ans=0;FOR(i,0,up){ans+=dfs(pos-1,sum+i,(m*10+i)%7,limit&&i==up);}if(!limit)dp[pos][sum][m]=ans;return ans;
}
ll solve(ll x)
{int pos=0;while(x){a[++pos]=x%10;x/=10;}a[pos+1]=0;return dfs(pos,0,0,1);
}
int main()
{ll n,m;FOR(i,0,20)FOR(j,0,162)FOR(k,0,7)dp[i][j][k]=-1;while(scanf("%lld%lld",&n,&m)){if(n==0&&m==0) break;n=solve(n-1);m=solve(m);printf("%lld\n",m-n);}return 0;
}

H.梦中的勇士

题目描述

有一天,我们的孙学长因为“训练过于辛苦”,敲着敲着代码就睡着了。睡梦中,孙学长成了拯救世界的勇士。
孙学长梦中的世界是这样的,n个交叉路口,为1,2,3,...,n,由n-1条双向道路连接着。我们的孙学长现在在交叉路口1,最初有X的血值。
除了孙学长现在所在的交叉路口1,每个交叉路口都有一个大怪兽,大怪兽没有复活的能力,所以被孙学长打败后该路口就没有怪兽了(嘎嘎),
如果孙学长想要去第k个路口,他必须与这个路口的怪兽斗争。
在斗争中,孙学长会失去ai的血量,当他最终打败怪兽的时候,他会得到bi的血量(不要问问什么,因为这是他的梦,嘤嘤嘤)
我们的孙学长是超级厉害的,所以他一定会打败怪兽。但是,如果孙学长的血量变为负数(<0),他会感觉自己好low(啊哈哈哈),所以我们的孙学长是不会让这种情况出现的!!!
当孙学长梦到自己像超人一样打败所有怪兽的时候,他被自己的猪队友敲键盘的声音吵醒了,孙学长很不开心,毕竟不是人人都可以当super hero。
为了“惩罚”他,孙学长把自己的梦告诉了他,要求他算出在梦中的自己血量不为负数的情况下,最初需要的血量X最少为多少。
孙学长的猪队友太猪了,机智的你能帮帮他的猪队友算出来吗?
(温馨提示,如果孙学长想去有道路连接的下一个路口,他必须先打败当前路口的怪兽~)

输入描述:

第一行一个数T(1<=T<=2000),表示测试样例的数量。
每一个测试样例中,第一行一个数字n(2<=n<=100000)表示交叉路口的数量。
接下来的n-1行,每行两个数字ai,bi(0<=ai,bi<=10^9),表示第2,3,...,n个路口打败怪兽失去的血量和得到的血量。
再接下来的n-1行,每行两个数字u和v,表示u和v路口之间有道路连接。
保证∑n≤10^6.

输出描述:

对于每一个样例,输出一个单独的数字,表示最初的最小的血量。每个数字占一行。

输入

1
4
2 6
5 4
6 2
1 2
2 3
3 4

输出

3
//贪心模拟+并查集+堆(优先队列)优化父亲节点
//因为对于同一层而言,只是比较谁的a小,谁的b大,不同层,需要先ko掉父亲再找儿子才可以,这种情况就需要判断一下。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
using namespace std;
typedef long long ll;
const int maxn=2e5+10;
struct node{int u,num;ll a,b;bool operator< (const node &x) const {//流水线排序         因为是优先队列,和正常的排序是反的if(a>=b&&x.a< x.b) return true;if(a< b&&x.a>=x.b) return false;if(a< b&&x.a< x.b) return a>x.a;//对于a< b的,按照a从小到大if(a>=b&&x.a>=x.b) return b<x.b;//对于a>=b的,按照b从大到小}void operator+=(const node &x){//节点合并,节点a表示至少需要a的血量杀死这个怪物ll A=max(a,a-b+x.a);ll B=b-a+x.b-x.a+A;a=A,b=B;}}a[maxn];priority_queue<node> q;
vector<int> g[maxn];
int fa[maxn],del[maxn],vis[maxn];void init(int n)//初始化
{while(!q.empty()) q.pop();for(int i=0;i<=n;i++){vis[i]=0;del[i]=0;g[i].clear();a[i].a=a[i].b=0;a[i].u=a[i].num=0;a[i].u=i;}
}void dfs(int u,int father)
{fa[u]=father;for(int i=0;i<g[u].size();i++){int v=g[u][i];if(v!=father)dfs(v,u);}
}int Find(int u)//并查集路径压缩
{if(del[fa[u]])//父亲被删除,就找爷爷return fa[u]=Find(fa[u]);elsereturn fa[u];
}int main()
{int t;scanf("%d",&t);while(t--){int n; scanf("%d",&n);init(n);for(int i=2;i<=n;i++){scanf("%lld%lld",&a[i].a,&a[i].b);a[i].u=i;a[i].num=0;q.push(a[i]);}for(int i=1;i<n;i++){int u,v;scanf("%d%d",&u,&v);g[u].push_back(v);g[v].push_back(u);}dfs(1,0);int pos=0;while(!q.empty()){node t=q.top();q.pop();if(del[t.u]||t.num!=vis[t.u])continue;//如果节点删除或者节点已经被更新del[t.u]=1;//删除该点int f=Find(t.u);//找父节点a[f]+=a[t.u];if(f>1){a[f].num=vis[f]=++pos;//更新f节点(找到的父亲节点)q.push(a[f]);}}printf("%lld\n",a[1].a);}return 0;
}

I.数学题

题面描述
最近,华东交通大学ACM训练基地的老阿姨被一个数学问题困扰了很久,她希望你能够帮她解决这个问题。
这个数学问题是这样的,给你一个N,要求你计算

gcd(a,b)表示a和b的最大公约数

输入描述:

多组输入,每行一个整数n(1<=n<=10^14)。

输出描述:

每行一个整数,表示答案。由于答案会很大你要对1000000007取模。

输入

4
10

输出

6
35

说明

样例一,2+4=6。
样例二,2+4+5+6+8+10=35。

题解:

该公式相当于求  小于等于n中所有与n不互质的数的和 
根据欧拉函数得知  小于或等于n的数中,与n互质的数的总和为φ(n) * n / 2  (n>1)
答案就是   
1. 0  (n=1)
2  n*(n+1)/2 - φ(n) * n / 2  (n>1)

注意取模不能直接除2,需要乘2对1e9+7的逆元,还有许多小细节!
#include<iostream>
#include<cstring>
#include<cstdio>
#define ll long long
#define MOD 1000000007
using namespace std;
ll euler(ll n)
{ll ans=1,i;for(i=2;i*i<=n;i++){if(n%i==0){n/=i;ans*=i-1;while(n%i==0){n/=i;ans*=i;ans%=MOD;}}}if(n>1) ans*=n-1;return ans%MOD;
}
ll pow(ll a,ll b)
{ll ans=1;for(;b;b>>=1){if(b&1) ans=(ans*a)%MOD;a=(a*a)%MOD;}return ans%MOD;
}
int main()
{ll n;while(cin>>n){if(n==1){cout<<0<<endl;continue;}ll m=euler(n);n%=MOD;      //注意不能提前取模,不然算出来的m是错的ll ans=(n*(n+1-m)%MOD)*pow(2,MOD-2);  //注意取模防爆llcout<<(ans%MOD+MOD)%MOD<<endl;   //注意取模加MOD防出现负数}return 0;
}

J.死肥宅的冲分计划

题目描述
国庆十天假,死肥宅选择回家休息,休息期间死肥宅开始了他的召唤师峡谷冲分之旅,冲分之前死肥宅向其他队员打赌十天内必上王者,已知死肥宅初始段位为黄金,因为死肥宅是游戏鬼才,所以他可以控制每天的段位变化不会超过一个大段,每天都会有队员查看下死肥宅的段位,如果死肥宅上了一个大段那么就会在小本本上记一个1,如果大的段位没有变化那么就会在小本本上记一个0,如果掉了一个大段,那么就记一个7,但是存在一些特殊情况使得队员记录的数字代表的意义会发生一些改变(详情可看备注)十天后,我们可以得到一个10个数字的序列,试着根据这串序列算出死肥宅是否上了王者,如果死肥宅成功的话那么请输出“666”,否则请输出“777"。

输入描述:
多组输入,每行输入10个数字,只包含1,0,7,三个数字。
输出描述:
10天后如果死肥宅的段位达到王者,输出"666";否则输出"777"。
示例1
输入
7 7 7 7 7 7 7 7 7 7
1 1 1 1 1 1 1 1 1 1
输出
777
666

备注:
段位晋级规则为:
黄铜 -> 白银 -> 黄金 -> 白金 -> 钻石 -> 大师 -> 王者
特殊状况:
如果降到黄铜,且下一天仍然没有升段,因为黄铜下面没有其他段位,那么记录信息的队员会在7和0中随机记录一个,7和0都代表当前段位没有发生变化。
如果升到王者,且下一天仍然没有掉段,因为王者之上没有其他段位,那么记录信息的队员会在0和1中随机记录一个,1和0都代表当前段位没有发生变化。
水题,模拟,(注意起始为黄金)。

#include<iostream>
#include<cstring>
#include<stdio.h>
int duanwei;
using namespace std;
int main()
{int s[11];while(scanf("%d",&s[0])!=EOF){duanwei=2;for(int i=1;i<10;i++)scanf("%d",&s[i]);for(int i=0;i<10;i++) {if(duanwei==0){if(s[i]!=1) duanwei =0;else duanwei++;}else if(duanwei==6){if(s[i]!=7) ;else duanwei--;}else {if(s[i]==7)  duanwei--;else if(s[i]==1) duanwei++;}}if(duanwei==6) cout<<"666"<<endl;else cout<<"777"<<endl;}return 0;
} 

K.MIKU酱的氪金宝典

题目描述

MIKU酱是个玩游戏氪金的人,游戏公司给她制定了新的规则,如果想从关卡i到关卡j,你需要交一些钱就可以了,但同时,MIKU酱的爸爸zjw很爱她,所以她可以每过一关就向她爸要一次钱,但她爸每次给他的钱是固定的,MIKU酱是个不会节省的女孩,哪怕每次多出来的钱,她也会拿去买肥宅快乐水,所以每次要的钱一定花完,因为MIKU酱不想挨骂,所以希望每次他爸给她的钱最少。

tips(到达第n关即通过,每到达一关一定能通过这关)

输入描述:

多组输入,每个样例第一行输入两个整数n,m(2<=n<=200,1<=m<=1000)表示关卡和规则的数量,接下来m行规则,每行输入x,y,w(w<=1000),表示从关卡x到y需要缴纳w的费用,保证题目有解,不会出现x=y的情况

输出描述:

输出一行,代表最少的钱

输入

4 4
1 2 2
1 3 1
2 4 3
3 4 1

输出

1

题解:

最短路不解释,不过我用的Floyd算法是怎么AC的(懵逼o((⊙﹏⊙))o)

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
int maze[205][205];
int n,m;
int dp[205][205];
#define INF 0x3f3f3f3f
int main()
{int x,y,w;while(scanf("%d%d",&n,&m)!=EOF){memset(dp,INF,sizeof(dp));memset(maze,INF,sizeof(maze));while(m--){scanf("%d%d%d",&x,&y,&w);maze[x][y]=min(w,maze[x][y]);}for(int k=1;k<=n;k++){for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){maze[i][j]=min(maze[i][j],max(maze[i][k],maze[k][j]));}}}printf("%d\n",maze[1][n]);}return 0;
}

华东交通大学2018年ACM双基程序设计大赛题解相关推荐

  1. 华东交通大学2017年ACM双基程序设计大赛题解

    简单题 Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other) Total Submissio ...

  2. 华东交通大学2018年ACM“双基”程序设计竞赛

    华东交通大学2018年ACM"双基"程序设计竞赛 1. A.ecjtuacm 题目描述 为了给acm打劲,我们喊出"ecjtu"后,你要喊出"ecjt ...

  3. 华东交通大学2018年ACM“双基”程序设计竞赛 D

    摸鱼之王MIKU酱想去埃及玩,需要一个人陪同.小新和小磊都想陪MIKU酱一起去,但名额只有一个.所以小磊和小新决定用一个小游戏来决定谁和MIKU酱出去玩.     游戏的道具是21张塔罗牌,塔罗牌分为 ...

  4. 华东交通大学2013年ACM“双基”程序设计竞赛获奖公示

    华东交通大学2013年ACM"双基"程序设计竞赛获奖公示 2013年11月13日  华东交通大学ACM-ICPC训练基地 2013年10月26日12点至17点我校举办了华东交通大学 ...

  5. 华东交通大学2021年ACM“双基”程序设计竞赛 D-宝石个人解答(C+python)

    D-宝石 https://ac.nowcoder.com/acm/contest/21684/D 题目描述: 最近小椒迷上了打游戏,但是他只能在周五.周六.周日和法定节假日每日20时至21时玩一个小时 ...

  6. 华东交通大学2022年ACM“双基“程序设计竞赛

    Fly 1.铁路 题意: n个点,m条路将其连起来. q次询问, opt=1时输出A,B两点的最短距离: opt=2时在A,B之间修建一条花费时间C的铁路. 思路: 先无向边建图, 注意:可能有重边和 ...

  7. hdu6383(2018 “百度之星”程序设计大赛 - 初赛(B))

    p1m2 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Sub ...

  8. hdu6380(2018 “百度之星”程序设计大赛 - 初赛(B))

    degree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total S ...

  9. hdu6375(2018 “百度之星”程序设计大赛 - 初赛(A))

    度度熊学队列 Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total S ...

最新文章

  1. c++ 获取文件的hashcode_jsp 实现文件上传和下载
  2. 做python自动化得时候怎么添加断言_在编写Web自动化测试用例的时候,如何写断言使新手不解,严格意义上来讲,没有断言的自动化脚本不能叫测试用例。就像功能测试一样,当测试人员做了一些操作...
  3. c# 注册表操作,创建,删除,修改,判断节点是否存在
  4. C语言520心形表白,初学者福利!!
  5. 工业交换机的日常维护保养该怎么做?
  6. mysql实现阻塞队列_阻塞队列--LinkedBlockingQueue
  7. .vimrc示例文件
  8. js 跨域深入理解与解决方法
  9. [读书笔记]密码文件总结
  10. 1133 Splitting A Linked List
  11. 聊天机器人的“高情商”炼成术
  12. 自定义alert弹出框
  13. [自我介绍]第一篇博客
  14. background 与 background-image
  15. hdu 4311 4312 Meeting point 曼哈顿距离之和最小
  16. 怎样查看自己的wifi密码?
  17. 多校冲刺NOIP模拟6 - 游戏——矩阵乘法、后缀自动机SAM
  18. 冬季你最需要什么水果?
  19. 老铁,你这什么键盘布局? 当然是Colemak
  20. html怎样图片不会失真,css解决图片失真

热门文章

  1. pycharm:远程连接服务器调试代码(保姆级详细步骤)
  2. APS高级计划排程 基本概念
  3. kdj值应用口诀_【技术帖】KDJ指标应用口诀
  4. 【pyhon】理想论坛爬虫1.05版,将读取和写DB分离成两个文件
  5. unity游戏动画 从入门到住院 二 模型导入
  6. TDSQL PG 版企业级分布式数据库技术创新实践
  7. 北京语言大学计算机英语统考,大学英语b级复习资料_统考英语b题库|北语网院大学英语b辅导...
  8. load()方法异步请求数据
  9. centos7启动dhcp失败_CentOS7中DHCP配置
  10. java还原混淆代码,android混淆 android如何将混淆代码还原?