//今天我们队一共出了三个题,1004,1008,1010,没出1006真是个悲剧;
//1004,枚举等号的位置后爆搜两边:
#include<stdio.h>
#include<string.h>
char str[20];
int v,cnt,len;
void find(int sum,int rem,int dep,int t)
{
if(sum>1e8||rem>1e8)return;
if(dep==len)
{
if(sum+rem==t)
cnt++;
}
else
{
if(rem)
find(sum+rem,str[dep]-'0',dep+1,t);
find(sum,rem*10+str[dep]-'0',dep+1,t);
}
}
void dfs(int end,int dep,int rem,int sum)
{
if(sum>1e8||rem>1e8)return;
if(dep>end)
{
find(0,0,dep,sum+rem);
}
else
{
dfs(end,dep+1,rem*10+str[dep]-'0',sum);
if(rem)
dfs(end,dep+1,str[dep]-'0',sum+rem);
}
}
int main()
{
int i;
while(scanf("%s",str)!=EOF)
{
if(!strcmp(str,"END"))break;
len=strlen(str);
cnt=0;
for(i=1;i<len;i++)
dfs(i-1,0,0,0);
printf("%d\n",cnt);
}
return 0;
}
//1008:咋一看有点像线段树,搞了我们半天,也没想到lazy的地方,后面才想到用数论去搞,思路:开始对区间直接容斥筛选,因为m很小,后面就直接枚举改变的地方就好了;
#include<stdio.h>
#include<string.h>
#include<map>
using namespace std;
int vis[1000],prime[500],cnt;
void init()
{
int i,j;
memset(vis,0,sizeof(vis));
for(i=2;i<100;i++)
if(!vis[i])
for(j=i+i;j<1000;j+=i)
vis[j]=1;
for(i=2,cnt=0;i<1000;i++)
if(!vis[i])prime[cnt++]=i;
}
__int64 pri[100];
__int64 get(__int64 n)
{
__int64 i,j=0;
for(i=0;n>=prime[i]&&i<cnt;i++)
{
if(n%prime[i]==0)
{
pri[j++]=prime[i];
while(n%prime[i]==0)
{
n/=prime[i];
}
}
}
if(n>1)pri[j++]=n;
return j;
}
__int64 gcd(__int64 a,__int64 b)
{
return b==0?a:gcd(b,a%b);
}
__int64 sum,flag;
void yy(int p,int rem,int dep,int start,int end)
{
__int64 i;
__int64 tem;
if(dep==0)
{
tem=p/rem;
if(flag)
sum+=(tem+1)*tem*rem/2;
else sum-=(tem+1)*tem*rem/2;
}
else
{
for(i=start;i<=end-dep+1;i++)
yy(p,rem*pri[i],dep-1,i+1,end);
}
}
void find(__int64 n,__int64 p)
{
int i,j,len;
if(n==0){sum=0;return;}
len=get(p);
sum=(1+n)*n/2;
flag=0;
for(i=1;i<=len;i++)
{
yy(n,1,i,0,len-1);
flag=(flag)?0:1;
}
}
int main()
{
int cas,op;
__int64 n,m,l,r,p,tem,k;
init();
scanf("%d",&cas);
while(cas--)
{
scanf("%I64d%I64d",&n,&m);
map <int,int> mp;
while(m--)
{
scanf("%d",&op);
if(op==1)
{
scanf("%I64d%I64d%I64d",&l,&r,&p);
if(l>r)
{
tem=l;
l=r;
r=tem;
}
find(l-1,p);
tem=sum;
find(r,p);
sum-=tem;
map <int,int> ::iterator it;
for(it=mp.begin();it!=mp.end();it++)
{
tem=it->first;
if(tem>=l&&tem<=r)
{
if(gcd(p,it->first)==1)
sum-=it->first;
if(gcd(p,it->second)==1)
sum+=it->second;
}
}
printf("%I64d\n",sum);
}
else
{
scanf("%I64d%I64d",&l,&r);
mp[l]=r;
}
}
}
return 0;
}
//1010:一个模拟题,各种stl直接搞就好了,可是一个找共同的父亲节点让我们wa了半天,我们一直以为a如果是b的父亲,那么他们的公共父亲也是a,唉,后面看来讨论才知道,这里错了;傻逼了;
#include<iostream>
#include<string.h>
#include<set>
#include <map >
#include<algorithm>
#include<vector>
#include<string>
using namespace std;
struct node
{
int parent;
string name;
int cnt,dep;
map < string,int > son;
}num[50000];
int cal(string s)
{
int i,len=s.length();
for(i=0;i<len;i++)
{
if(s[i]!='.')
return i;
}
}
void f(int id,int dep)
{
map <string,int> ::iterator it;
num[id].dep=dep;
for(it=num[id].son.begin();it!=num[id].son.end();it++)
{
f(it->second,dep+1);
}
}
void print(int id)
{
int i;
map <string,int> ::iterator it;
for(i=1;i<num[id].dep;i++)
cout<<".";
cout<<num[id].name<<endl;
for(it=num[id].son.begin();it!=num[id].son.end();it++)
print(it->second);
}
int pa[50000];
int main()
{
string a,b;
char op[5];
int n,m,i,len,id[2],k[2];
while(1)
{
cin>>n;
if(!n)break;
for(i=0;i<=n;i++)
{
pa[i]=0;
num[i].son.clear();
num[i].parent=0;
num[i].cnt=0;
num[i].dep=0;
}
map <string ,int > mp;
for(i=1;i<=n;i++)
{
cin>>num[i].name;
len=cal(num[i].name);
a=num[i].name.substr(len,num[i].name.length()-len);
mp[a]=i;
num[i].name=a;
if(len>0)
{
num[pa[len-1]].cnt++;
num[i].parent=pa[len-1];
num[pa[len-1]].son[num[i].name]=i;
}
else num[i].parent=0;
pa[len]=i;
}
cin>>m;
f(1,1);
while(m--)
{
cin>>op;
if(op[0]=='L')
print(1);
else if(op[0]=='b')
{
cin>>a;
if(num[mp[a]].parent)
{
cout<<num[num[mp[a]].parent].cnt<<endl;
}
else cout<<"1"<<endl;
}
else
{
cin>>a>>b;
id[0]=mp[a];
id[1]=mp[b];
k[0]=id[0];
k[1]=id[1];
if(id[0]==id[1])
{
cout<<num[num[id[0]].parent].name<<endl;
continue;
}
while(id[0]!=id[1])
{
if(num[id[0]].dep>num[id[1]].dep)
{
id[0]=num[id[0]].parent;
}
else if(num[id[0]].dep<num[id[1]].dep)
id[1]=num[id[1]].parent;
else
{
id[0]=num[id[0]].parent;
id[1]=num[id[1]].parent;
}
}
if(id[0]==k[0])
id[0]=num[k[0]].parent;
else if(id[0]==k[1])
id[0]=num[k[1]].parent;
cout<<num[id[0]].name<<endl;
}
}
}
return 0;
}