T1
题目描述:
判读一个数是否为两个斐波拉契数的乘积。
Fibonacci 数的定义:F0=0,F1=1,Fk=Fk-1+Fk-2 。
输入格式
第一行一个整数 T 代表提问次数。
接下来 T 行,每行一个数字 A 表示询问的数。
输出格式
对于每次提问,如果这个数可以被分解成两个 Fibonacci 数的成绩输出“Yes”,否则输出“No”。
备注
【数据范围】
对于 50% 的数据:A≤50;
对于 100% 的数据:T≤100;0≤A≤10^9 。
解析:
一道看似简单却暗藏杀机的模拟题。
因为斐波那契数列的增长速度是很快的,所以可以先打表找出最大的值。
由于数据最大为10^9,所以只用找到刚好超过最大值的数就行了。
注意数组用long long
代码:
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
long long sum[50];
int n,t;
inline int get_int()
{
int x=0,f=1;
char c;
for(c=getchar();(!isdigit(c))&&(c!='-');c=getchar());
if(c=='-') {f=-1;c=getchar();}
for(;isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+c-'0';
return x*f;
}
int main()
{
//freopen("fib.in","r",stdin);
//freopen("fib.out","w",stdout);
sum[1]=1;
for(int i=2;i<=45;i++) sum[i]=sum[i-1]+sum[i-2];
t=get_int();
while(t--)
{
int x=0;
n=get_int();
for(int i=0;i<=45;i++)
{
for(int j=0;j<=45;j++)
if((sum[i]*sum[j])==n) {x=1;break;}
if(x==1) break;
}
if(x==1) cout<<"Yes"<
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
const int Max=100100;
int n,m,s,ans,head,tail;
int first[Max],depth[Max],point[Max];
int f[Max][25],exist[Max];
struct shu{int to,next;};
shu bian[Max*4];
int size[Max],to[Max];
inline int get_int()
{
int x=0,f=1;
char c;
for(c=getchar();(!isdigit(c))&&(c!='-');c=getchar());
if(c=='-') {f=-1;c=getchar();}
for(;isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+c-'0';
return x*f;
}
inline void build(int x,int y) //建边
{
s++;
bian[s].next=first[x];
first[x]=s;
bian[s].to=y;
}
inline void pre()
{
memset(exist,0,sizeof(exist));
head=0;
tail=1;
point[1]=1;
depth[1]=0;
exist[1]=1;
while(head=0;i--) if(len>=1<=0;i--) if(f[x][i]!=f[y][i]) {x=f[x][i];y=f[y][i];}
return f[x][0];
}
inline void go(int point) //计算size
{
size[point]=1;
for(int u=first[point];u;u=bian[u].next)
if(bian[u].to!=f[point][0])
{
go(bian[u].to);
size[point]+=size[bian[u].to];
}
}
inline void find(int x,int y,int mid,int father)
{
int midpoint;
if(depth[x]=0;i--)
if(mid>=1<=0;i--) if(len1>=1<=0;i--) if(len2>=1<=0;i--) if(len>=1<>1;
ans=0;
find(x,y,mid,father);
cout<
#include
using namespace std;
const int Max=100100;
int t,n,k,s;
int f[Max][5];
int first[Max*2];
struct shu{int to,next;};
shu bian[Max*2];
bool exist[Max*2];
inline int get_int()
{
int x=0,f=1;
char c;
for(c=getchar();(!isdigit(c))&&(c!='-');c=getchar());
if(c=='-') {f=-1;c=getchar();}
for(;isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+c-'0';
return x*f;
}
void clean()
{
s=0;
memset(exist,0,sizeof(exist));
memset(f,0,sizeof(f));
memset(bian,0,sizeof(bian));
memset(first,0,sizeof(first));
}
inline void build(int x,int y)
{
s++;
bian[s].next=first[x];
first[x]=s;
bian[s].to=y;
}
inline void dfs(int point,int father)
{
int sum=0;
if(exist[point]) return;
exist[point]=1;
for(register int u=first[point];u;u=bian[u].next)
{
if(bian[u].to!=father)
{
dfs(bian[u].to,point);
f[point][0]+=max(f[bian[u].to][0],f[bian[u].to][1]);
sum+=f[bian[u].to][1];
}
}
for(register int u=first[point];u;u=bian[u].next)
if(bian[u].to!=father)
f[point][1]=max(f[point][1],sum-f[bian[u].to][1]+f[bian[u].to][0]+1);
}
int main()
{
// freopen("tree.in","r",stdin);
//freopen("lx.out","w",stdout);
t=get_int();
while(t--)
{
int ans=-1;
clean();
n=get_int();
k=get_int();
for(register int i=1;i<=n-1;i++)
{
int x=get_int();
build(i+1,x);
build(x,i+1);
}
dfs(1,-1);
ans=max(f[1][0],f[1][1]);
if(ans*2>=k) cout<<(k+1)/2<