百度之星初赛签到(1001/1005)
Polynomial
度度熊最近学习了多项式和极限的概念。 现在他有两个多项式 f(x)f(x) 和 g(x)g(x),他想知道当 xx 趋近无限大的时候,f(x) / g(x)f(x)/g(x) 收敛于多少。
第一行一个整数 T~(1 \leq T \leq 100)T (1≤T≤100) 表示数据组数。 对于每组数据,第一行一个整数 n~(1 \leq n \leq 1,000)n (1≤n≤1,000),n-1n−1 表示多项式 ff 和 gg 可能的最高项的次数(最高项系数不一定非0)。 接下来一行 nn 个数表示多项式 ff,第 ii 个整数 f_i~(0 \leq f_i \leq 1,000,000)fi (0≤fi≤1,000,000) 表示次数为 i-1i−1 次的项的系数。 接下来一行 nn 个数表示多项式 gg,第 ii 个整数 g_i~(0 \leq g_i \leq 1,000,000)gi (0≤gi≤1,000,000) 表示次数为 i-1i−1 次的项的系数。 数据保证多项式 ff 和 gg 的系数中至少有一项非0。
对于每组数据,输出一个最简分数 a/ba/b(aa 和 bb 的最大公约数为1)表示答案。 如果不收敛,输出 1/01/0。
3 2 0 2 1 0 2 1 0 0 2 3 2 4 0 1 2 0
1/0
0/1
2/1
样例描述
这些多项式分别为
f(x) = 2x
f(x)=2x
g(x) = 1
g(x)=1
f(x) = 1
f(x)=1
g(x) = 2x
g(x)=2x
f(x) = 4x + 2
f(x)=4x+2
g(x) = 2x + 1
g(x)=2x+1
思路:上下两个数组从后往前比较一下0出现的位置就行了,就是找到第一个非0位置!:) 答案要么是0/1,要么是1/0,要么就是一个上下需要约分一下的比值
代码:
#include<bits/stdc++.h> using namespace std; #define LL long long #define INF 2000000000 #define eps 1e-8 #define pi 3.141592653589793 const LL mod = 1e9+7; struct node{ int x,y; }p[1001]; int main() { int _; for(scanf("%d",&_);_--;){ int n; scanf("%d",&n); int Min = 10000000,Max = 0; for(int i = 0 ; i < n ; i++){ scanf("%d",&p[i].x); } for(int i = 0 ; i < n ; i++){ scanf("%d",&p[i].y); } for(int i = n-1 ; i >= 0 ;i --){ if(p[i].x == 0 && p[i].y == 0)continue; if(p[i].x == 0 && p[i].y != 0){ puts("0/1");break; }else if(p[i].x != 0 && p[i].y == 0){ puts("1/0");break; }else{ LL a = __gcd(p[i].x,p[i].y); printf("%lld/%lld\n",p[i].x*1LL/a,p[i].y*1LL/a); break; }//判断非零出现的位置,三种情况 } } }
E:Seq
Seq
度度熊有一个递推式 a_{n} = (\sum_{i=1}^{n-1} a_{i}*i) \% nan=(∑i=1n−1ai∗i)%n 其中 a_1 = 1a1=1。现给出 nn,需要求 a_nan。
第一行输入一个整数 TT,代表 T~(1 \leq T \leq 100000T (1≤T≤100000) 组数据。 接下 TT 行,每行一个数字 n~(1\leq n \leq 10^{12})n (1≤n≤1012)。
输出 TT 行,每行一个整数表示答案。
5 1 2 3 4 5
1 1 0 3 0
思路:打个表发现从n从4开始,6个一循环的。每个循环节里面都有规律可以找。比如除以二,减去一之类的。注意用long long
代码:
#include<bits/stdc++.h> using namespace std; #define LL long long #define INF 2000000000 #define eps 1e-8 #define pi 3.141592653589793 const LL mod = 1e9+7; int main() { /* LL a[1112]; int n = 150; a[1] = 1LL; for(int i = 2 ; i <= n ; i ++){ LL sum = 0; for(int j = 1 ; j <= i-1 ; j ++){ sum += a[j]*j; sum %= i; } a[i] = sum; if( sum + 1 == i )printf("---"); printf("%d : %lld \n",i,sum); } */ int _; for(scanf("%d",&_);_--;){ LL n; scanf("%I64d",&n); if(n == 1|| n == 2){ printf("1\n"); }else if(n == 3){ printf("0\n"); }else{ LL k = n-4; if(k%6 == 0){ printf("%I64d\n",n-1); } else if(k%6==1){ printf("%I64d\n",n/6); } else if(k%6==2){ printf("%I64d\n",n/2); } else if(k%6==3){ printf("%I64d\n",n-(k/6+1)*2); } else if(k%6==4){ printf("%I64d\n",n/2); } else if(k%6==5){ printf("%I64d\n",k/6+1); } } } }/* */