百度之星初赛签到(1001/1005)

A:Polynomial

Polynomial

 Time Limit: 2000/1000 MS (Java/Others)
 
 Memory Limit: 32768/32768 K (Java/Others)
Problem Description

度度熊最近学习了多项式和极限的概念。 现在他有两个多项式 f(x)f(x) 和 g(x)g(x),他想知道当 xx 趋近无限大的时候,f(x) / g(x)f(x)/g(x) 收敛于多少。

Input

第一行一个整数 T~(1 \leq T \leq 100)T (1T100) 表示数据组数。 对于每组数据,第一行一个整数 n~(1 \leq n \leq 1,000)n (1n1,000),n-1n1 表示多项式 ff 和 gg 可能的最高项的次数(最高项系数不一定非0)。 接下来一行 nn 个数表示多项式 ff,第 ii 个整数 f_i~(0 \leq f_i \leq 1,000,000)fi​​ (0fi​​1,000,000) 表示次数为 i-1i1 次的项的系数。 接下来一行 nn 个数表示多项式 gg,第 ii 个整数 g_i~(0 \leq g_i \leq 1,000,000)gi​​ (0gi​​1,000,000) 表示次数为 i-1i1 次的项的系数。 数据保证多项式 ff 和 gg 的系数中至少有一项非0。

Output

对于每组数据,输出一个最简分数 a/ba/b(aa 和 bb 的最大公约数为1)表示答案。 如果不收敛,输出 1/01/0。

Sample Input
3
2
0 2
1 0
2
1 0
0 2
3
2 4 0
1 2 0
Sample Output
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

 Time Limit: 2000/1000 MS (Java/Others)
 
 Memory Limit: 32768/32768 K (Java/Others)
Problem Description

度度熊有一个递推式 a_{n} = (\sum_{i=1}^{n-1} a_{i}*i) \% nan​​=(i=1n1​​ai​​i)%n 其中 a_1 = 1a1​​=1。现给出 nn,需要求 a_nan​​。

Input

第一行输入一个整数 TT,代表 T~(1 \leq T \leq 100000T (1T100000) 组数据。 接下 TT 行,每行一个数字 n~(1\leq n \leq 10^{12})n (1n1012​​)。

Output

输出 TT 行,每行一个整数表示答案。

Sample Input
5
1
2
3
4
5
Sample Output
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);    
            }
        }
    }
}/*
 
*/

 



posted on 2019-08-18 08:52  Esquecer  阅读(334)  评论(0编辑  收藏  举报

导航