Arithmetic of Bomb Accepts: 1050 Submissions: 1762
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Problem Description
众所周知,度度熊非常喜欢数字。
它最近在学习小学算术,第一次发现这个世界上居然存在两位数,三位数……甚至N位数!
但是这回的算术题可并不简单,由于含有表示bomb的#号,度度熊称之为 Arithmetic of Bomb。
Bomb Number中的bomb,也就是#号,会展开一些数字,这会导致最终展开的数字超出了度度熊所能理解的范畴。比如”(1)#(3)”表示”1”出现了3次,将会被展开为”111”,
同理,”(12)#(2)4(2)#(3)”将会被展开为”12124222”。
为了方便理解,下面给出了Bomb Number的BNF表示。
请将Bomb Number中所有的#号展开,由于数字可能很长,结果对 1 000 000 007 取模。
Input
第一行为T,表示输入数据组数。
每组数据包含一个Bomb Expression。
1≤T≤100
1≤length(Bomb Number)≤1000
Output
对每组数据输出表达式的结果,结果对 1 000 000 007 取模。
Sample Input
4
1
(1)#(3)
(12)#(2)4(2)#(3)
(12)#(5)
Sample Output
1
111
12124222
212121205
题解:模拟就行了。。。
代码:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long int ll;
typedef pair<int,int>pa;
const int N=1e5+100;
const int mod=1e9+7;
const ll INF=1e18;
int read()
{
int x=0;
char ch = getchar();
while('0'>ch||ch>'9')ch=getchar();
while('0'<=ch&&ch<='9')
{
x=(x<<3)+(x<<1)+ch-'0';
ch=getchar();
}
return x;
}
/***********************************************************/
int t;
char str[10000];
string ans,zhi;
int main()
{
scanf("%d",&t);
while(t--)
{
int cnt=0;
scanf("%s",str);
int sz=strlen(str);
ll c=0;
bool flag=false;
ans.clear();
for(int i=0; iif(str[i]=='(')
{
if(flag)
{
int j=i;
while(str[++j]!=')')
{
c=c*10+str[j]-'0';
}
i=j;
for(ll k=1;k<=c;k++)
{
ans+=zhi;
}
zhi.clear();
c=0;
flag=false;
}
else
{
int j=i;
while(str[++j]!=')')
{
zhi+=str[j];
}
i=j;
}
}
else if(str[i]=='#')
{
flag=true;
}
else
{
ans+=str[i];
}
}
int l=ans.length();
ll ok=0;
for(int i=0;i10+ans[i]-'0')%mod;
}
printf("%I64d\n",ok);
}
}
Pokémon GO Accepts: 738 Submissions: 1725
Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Problem Description
众所周知,度度熊最近沉迷于 Pokémon GO。
今天它决定要抓住所有的精灵球!
为了不让度度熊失望,精灵球已经被事先放置在一个2*N的格子上,每一个格子上都有一个精灵球。度度熊可以选择任意一个格子开始游戏,抓捕格子上的精灵球,然后移动到一个相邻的至少有一个公共点的格子上继续抓捕。例如,(2, 2) 的相邻格子有(1, 1), (2, 1) 和 (1, 2) 等等。
现在度度熊希望知道将所有精灵球都抓到并且步数最少的方案数目。两个方案被认为是不同,当且仅当两个方案至少有一步所在的格子是不同的。
Input
第一行为T,表示输入数据组数。
每组数据包含一个数N。
●1≤T≤100
●1≤N≤10000
Output
对每组数据输出方案数目,结果对 1 000 000 007 取模。
Sample Input
3
1
2
3
Sample Output
Copy
2
24
96
题解:原题。
代码:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long int ll;
typedef pair<int,int>pa;
const int N=1e5+100;
const int mod=1e9+7;
const ll INF=1e18;
int read()
{
int x=0;
char ch = getchar();
while('0'>ch||ch>'9')ch=getchar();
while('0'<=ch&&ch<='9')
{
x=(x<<3)+(x<<1)+ch-'0';
ch=getchar();
}
return x;
}
/***********************************************************/
ll a[N];
ll b[N];
ll c;
int n,t;
void init()
{
b[1]=1;
for (int i=2; i<=10000; i++)
{
b[i]=(b[i-1]*2%mod);
b[i]%=mod;
}
a[1]=1;
a[2]=6;
for (int i=3; i<=10000; i++)
{
a[i]=(2*a[i-1]+b[i]+4*a[i-2])%mod;
}
}
void slove()
{
c=4*a[n];
for (int i=2; i8*b[n-i]*a[i-1]%mod)%mod+(8*a[n-i]*b[i-1])%mod)%mod;
}
printf("%I64d\n",c);
}
int main()
{
init();
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
if(n==1) puts("2");
else slove();
}
return 0;
}
Valley Numer Accepts: 548 Submissions: 1125
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Problem Description
众所周知,度度熊非常喜欢数字。
它最近发明了一种新的数字:Valley Number,像山谷一样的数字。
当一个数字,从左到右依次看过去数字没有出现先递增接着递减的“山峰”现象,就被称作 Valley Number。它可以递增,也可以递减,还可以先递减再递增。在递增或递减的过程中可以出现相等的情况。
比如,1,10,12,212,32122都是 Valley Number。
121,12331,21212则不是。
度度熊想知道不大于N的Valley Number数有多少。
注意,前导0是不合法的。
Input
第一行为T,表示输入数据组数。
每组数据包含一个数N。
● 1≤T≤200
● 1≤length(N)≤100
Output
对每组数据输出不大于N的Valley Number个数,结果对 1 000 000 007 取模。
Sample Input
3
3
14
120
Sample Output
Copy
3
14
119
题解:数位dp,设dp[i][j][k]表示当前位,前一位为j,前面是否为递增。
然后转移一下就行。
代码:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long int ll;
typedef pair<int,int>pa;
const int N=1e5+100;
const int mod=1e9+7;
const ll INF=1e18;
int read()
{
int x=0;
char ch = getchar();
while('0'>ch||ch>'9')ch=getchar();
while('0'<=ch&&ch<='9')
{
x=(x<<3)+(x<<1)+ch-'0';
ch=getchar();
}
return x;
}
/***********************************************************/
int t;
char str[110];
int a[110];
ll dp[110][11][2];
ll dfs(int pos,int zhi,int sta ,bool limit,bool lead)
{
if(pos==-1) return 1;
if(!limit&&dp[pos][zhi][sta]!=-1&&!lead)
return dp[pos][zhi][sta];
ll ans=0;
int up=limit?a[pos]:9;
for(int i=0;i<=up;i++)
{
if(lead)
{
if(i==0)
ans+=dfs(pos-1,0,0,limit&&i==a[pos],true);
else
ans+=dfs(pos-1,i,0,limit&&i==a[pos],false);
}
else
{
if(sta==1)
{
if(i>=zhi)
ans+=dfs(pos-1,i,1,limit&&i==a[pos],false);
}
else
{
ans+=dfs(pos-1,i,i>zhi,limit&&i==a[pos],false);
}
}
}
ans=ans%mod;
if(!limit&&!lead)
dp[pos][zhi][sta]=ans;
return ans;
}
ll solve()
{
int pos=0;
int sz=strlen(str);
for(int i=sz-1;i>=0;i--)
{
a[pos++]=str[i]-'0';
}
return dfs(pos-1,0,0,true,true)%mod;
}
int main()
{
scanf("%d",&t);
memset(dp,-1,sizeof(dp));
while(t--)
{
scanf("%s",str);
printf("%I64d\n",(solve()-1+mod)%mod);
}
}