20181029(高精度(其实不用)+高精度(其实分解质因数推论)+大力打表+网络流)

今天的模拟赛并不想做什么总结,也不想写题解。

进制

读入p; q; r,求出最小的b(2 ⩽ b ⩽ 16) 使得在b 进制下pb qb = r(pb
为p 在b 进制下的表示,比如1016 = 1610; 216 816 = 1016)。
若不存在合法的b 输出0。
1.1 输入格式
输入文件为base:in。
第一行为数据组数T。
接下来T 行每行三个整数p; q; r,其中p; q 为十进制数,r 是全由数字
构成的字符串。
1.2 输出格式
输出文件为base:out。
对于每组数据输出答案。
数据保证有解。
1.3 数据范围
令b 为最终答案,t 为b 进制下r 的大小。
对于所有数据,0 ⩽ p; q; t ⩽ 1018; 1 ⩽ T ⩽ 104。
对于60% 的数据,p; q; t ⩽ 109。

置换

对于给定的长度为n 的置换p,求最小的k 使得[1; 2 : : : n]pk = [1; 2 : : : n]。
定义置换a b = c 为,cbi = ai(1 ⩽ i ⩽ n),其中a; b; c 均为长度为n
的置换。
由于k 可能很大,请输出k mod 19184192。
2.1 输入格式
输入文件为perm:in。
第一行一个整数n。
第二行n 个整数表示p。
2.2 输出格式
输出文件为perm:out。
仅一行输出答案。
2.3 数据范围
对于所有数据,n ⩽ 105。
对于40% 的数据,n ⩽ 100。
对于60% 的数据,k ⩽ 1018。

24 点

24 点是一个大家熟知的游戏。
请求解由n 个n 组成的24 点游戏。
3.1 输入格式
输入文件为card:in。
第一行为数据组数T。
接下来T 行,每行一个整数表示n。
3.2 输出格式
输出文件为card:out。
对于每组数据,输出n ? 1 行:
若无解输出?1。
否则,令A 为长度2n ? 1 的数组,初始时81 ⩽ i ⩽ n;Ai = n,表示
初始的n 个n。
对于你输出的第i 行,格式为a op b(1 ⩽ a; b < n + i),其中op 为操
作类型(加+ 减? 乘 实数除/),该操作将Aa op Ab 赋值给An+i。
你的输出需要保证:
• A2n?1 = 24
• 每一个Ai 只被至多使用了一次
• A 中任意元素的分子分母的绝对值不大于109。
3.3 数据范围
对于所有数据
Σ
n ⩽ 105; n ⩽ 200。
对于30% 的数据n ⩽ 6。
对于50% 的数据n ⩽ 15。
对于70% 的数据n ⩽ 30。

反思一下吧:
1.代码能力还是不够强。
第一题的高精度勉勉强强过了样例,满心以为是对的,结果爆0,还不停地爆0,怎么测怎么错,说实话到现在也没发现哪里错了。。。。(最近这种情况好多,打完了自信过样例,随便做了几组小数据过了就好了,老是有一点小错误)
2.T2也是高精度,(虽然正解是分解质因数来推结论,但是高精度很直白)。。。于是调了巨久也没有调对,对于高精度取模操作,怎么调也不对,
3.T3来不及了,题解应该是24以前手推,24以后推规律
4.T4的话,时间上有一点来不及。。最后发现自己求错东西了,求的是等待时间,我做成求通过时间加上等待时间了,然后因为本身是求总时间,所以就怎么也过不去。。。。(等我研究一下再)

题解:
T1:题目中肉眼可见。
题意没有说清楚,所以明显的高精度比较稳妥。
下面给出我的代码和题解代码,求查错
我滴垃圾代码

#include<bits/stdc++.h>
using namespace std;
long long n,m,r;
long long a[110],b[110],c[110],d[220],lenr;
bool zhuan(long long x,long long y,int chu)
{
   
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        memset(d,0,sizeof(d));
        int lena=0;
        while (x)
         {
   
            a[++lena]=x%chu;
            x/=chu;
         }
        int lenb=0;
        while (y)
         {
   
            b[++lenb]=y%chu;
            y/=chu;
         }
        for (int i=1; i<=lena; i++)
          for (int j=1; j<=lenb; j++)
              d[i+j-1]+=a[i]*b[j];
        int lend=lena+lenb-1;
        long long tmp=0;
        for(int i=1;i<=lend;i++) tmp+=d[i],d[i]=tmp%chu,tmp/=chu;
        while(tmp) d[++lend]=tmp%chu,tmp/=chu;
        if(lend!=lenr) return false;
        for (int i=1; i<=lend; i++)
            if (d[i]!=c[i]) return false;
        return true; 
}

int main()
{
   
    int T;
    cin>>T;
    while (T--)
      {
   
        memset(c,0,sizeof(c));
        scanf("%lld%lld%lld",&n,&m,&r);
        cout<<n<<" "<<m<<" "<<r<<"\n";return 0;
        if((n==0||m==0)&&r==0){
   
            printf("2\n");
            continue;
        }
        lenr=0;
        while (r)
         {
   
           c[++lenr]=r%10;
           r/=10;
         }
        bool p=false;
        for (int op=2; op<=16; op++)
         {
    
            p=zhuan(n,m,op); 
            if (p) {
   printf("%d\n",op);break;}
         }
        if(!p) printf("0\n");
        cout<<p<<"\n";
      }
}

跟我一样方法的ak代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;
struct lll{
   
    int len,p[110];
    void read(){
   
        string s;cin>>s;len=s.size();
        for(int i=0;i<len;i++) p[len-i]=s[i]-'0';
    }
    bool operator == (const lll x) const{
   
        if(len!=x.len) return false;
        for(int i=1;i<=len;i++) if(p[i]!=x.p[i]) return false;
        return true;
    }
    void turn_it(int bas,ll t){
   
        len=0;
        while(t) p[++len]=t%bas,t/=bas;
    }
    void out(){
   
        for
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言代码分解质因数链表的主要思路如下: 1. 定义一个链表的数据结构,包含两个字段:一个是整数类型的质因数,另一个是整数类型的幂次。 2. 编写一个函数,用于将一个正整数分解为质因数,并将质因数和幂次添加到链表中。函数的输入参数是一个整数,输出参数是一个指向链表的头指针。 3. 在函数内部,使用一个循环来逐个判断该整数是否可以被某个质数整除,并计算该质数的幂次。 4. 如果该整数能被某个质数整除,则将该质数和幂次添加到链表中;同时更新整数的值,将该质数因子除掉。 5. 如果该整数不能被任何质数整除,则表示该整数已经被分解完毕,循环结束。 6. 返回链表的头指针。 以下是一个简单的示例代码: ```c #include <stdio.h> #include <stdlib.h> // 定义链表结点的数据结构 typedef struct Node { int factor; int power; struct Node* next; } Node; // 函数声明 Node* decomposePrimeFactors(int num); // 主函数 int main() { int num; printf("请输入一个正整数:"); scanf("%d", &num); Node* head = decomposePrimeFactors(num); Node* current = head; printf("质因数分解表:"); while (current != NULL) { printf("%d^%d", current->factor, current->power); current = current->next; if (current != NULL) { printf(" * "); } } printf("\n"); // 释放链表的内存 current = head; while (current != NULL) { Node* temp = current->next; free(current); current = temp; } return 0; } // 分解质因数并构建链表 Node* decomposePrimeFactors(int num) { int factor = 2; Node* head = NULL; Node* tail = NULL; while (num > 1) { int power = 0; while (num % factor == 0) { num /= factor; power++; } if (power > 0) { Node* newNode = (Node*)malloc(sizeof(Node)); newNode->factor = factor; newNode->power = power; newNode->next = NULL; if (head == NULL) { head = newNode; tail = newNode; } else { tail->next = newNode; tail = newNode; } } factor++; } return head; } ``` 请注意,该代码只是一个简单的示例,并没有考虑输入的正确性、异常情况等。在实际应用中,可能需要进行更多的错误处理和容错机制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值