دیباگ شایسته


  • محدودیت زمان: ۰.۵ ثانیه
  • محدودیت حافظه: ۶۴ مگابایت

می‌خواهیم همه محصولات کوئرا، یک اسم «شایسته» nn حرفی، با حروف کوچک انگلیسی داشته باشند که با حرف q آغاز شود.

به همین خاطر هر اسمی که برای یک محصول پیشنهاد می‌شود دو حالت دارد:

  • با q شروع می‌شود؛ پس اسم شایسته‌ای است و تغییری در آن نمی‌دهیم. برای مثال، quera شایسته‌ است پس آن را تغییر نمی‌دهیم.
  • با q شروع نمی‌شود پس شایسته نیست و باید یک حرف q به ابتدای آن اضافه کنیم تا شایسته شود. برای مثال، media باید به qmedia تغییر کند.

توضیح تصویر

از عبدالله کشتکار خواستیم که در ماه‌رمضان برنامه‌ای بنویسد که با ورودی گرفتن اسم محصول (رشته ss) و با توجه به توضیحات بالا آن را شایسته کند. اما به دلیل فشار روزه برنامه زیر نوشته شده که ایراد دارد.

برنامه‌های زیر همگی یکسان هستند و صرفا به زبان‌های مختلف ترجمه شده است.

کد پایتون
s = input()
print('q' + s)
Python
کد سی‌پلاس‌پلاس
#include <iostream>

using namespace std;

int main()
{
    string s;
    cin >> s;
    cout << "q" + s << endl;
    return 0;
}
C++
کد جاوا
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("q" + sc.next());
    }
}
Java

از شما می‌خواهیم برنامه‌ای بنویسید که با دریافت عدد nn یک رشته مانند ss شامل nn حرف کوچک انگلیسی چاپ کند و برنامه فوق به ازای این رشته ss خروجی مطابق توضیحات بالا ندهد.

ورودی🔗

در تنها سطر ورودی عدد صحیح و مثبت nn آمده است که طول رشته مورد انتظار در خروجی را نشان می‌دهد. 1n1001 \leq n \leq 100

خروجی🔗

یک رشته به طول nn، از حروف کوچک انگلیسی چاپ کنید که برنامه بالا به ازای این ورودی، به درستی کار نمی‌کند.

اگر چند جواب مختلف برای این مسئله وجود دارد یک جواب درست را به دلخواه چاپ کنید.

مثال🔗

ورودی نمونه ۱🔗

5
Plain text

خروجی نمونه ۱🔗

quera
Plain text

این خروجی یکی از خروجی‌های درست است، چون اگر آن را به برنامه عبدالله ورودی دهیم خروجی آن qquera می‌شود که خروجی درستی نیست.

ورودی نمونه ۲🔗

1
Plain text

خروجی نمونه ۲🔗

q
Plain text

خروجی برنامه عبدالله به ازای این ورودی qq خواهد بود ولی باید خروجی آن q باشد.

دیباگ مرتب‌سازی


  • محدودیت زمان: ۰.۵ ثانیه
  • محدودیت حافظه: ۶۴ مگابایت

منظور از یک «جایشگت» از اعداد 11 تا nn یعنی دنباله‌ای به طول nn مثل p1,p2,,pnp_1, p_2, \dots, p_n \, که هر کدام از اعداد 11 تا nn دقیقا یکبار در آن ظاهر شده است.

به یک دنباله مثل a1,a2,,ana_1, a_2, \dots, a_n \, «صعودی» می‌گوییم هرگاه برای هر ii که 1in11 \leq i \leq n - 1\, داریم ai<ai+1a_i < a_{i + 1} \,.

توضیح تصویر

از محمد جعفری خواستیم که در ماه‌رمضان برنامه‌ای بنویسد که با ورودی گرفتن nn و یک جایگشت از اعداد 11 تا nn آن را صعودی مرتب کند. اما به دلیل فشار روزه برنامه زیر نوشته شده که ایراد دارد.

برنامه‌های زیر همگی یکسان هستند و صرفا به زبان‌های مختلف ترجمه شده است.

کد پایتون
n = int(input())
arr = list(map(int, input().split()))

for i in range(n):
    for j in range(i, n - 1):
        if arr[j] > arr[j + 1]:
            arr[j], arr[j + 1] = arr[j + 1], arr[j]

print(*arr)
Python
کد سی‌پلاس‌پلاس
#include <iostream>

using namespace std;

int main()
{
    int n;
    cin >> n;

    int arr[n];
    for (int i = 0; i < n; i++)
        cin >> arr[i];

    for (int i = 0; i < n; i++)
        for (int j = i; j + 1 < n; j++)
        if (arr[j] > arr[j + 1])
                swap(arr[j], arr[j + 1]);

    for (int i = 0; i < n; i++)
    {
        cout << arr[i];

        if (i == n - 1)
            cout << '\n';
        else
            cout << ' ';
    }

    return 0;
}
C++
کد جاوا
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();

        int[] arr = new int[n];
        for (int i = 0; i < n; i++)
            arr[i] = sc.nextInt();

        for (int i = 0; i < n; i++)
            for (int j = i; j + 1 < n; j++)
                if (arr[j] > arr[j + 1]) {
                    int tmp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = tmp;
                }

        for (int i = 0; i < n; i++) {
            System.out.print(arr[i]);
            if (i == n - 1)
                System.out.println();
            else
                System.out.print(' ');
        }
    }
}
Java

با دریافت عدد nn جایگشتی از 11 تا nn را چاپ کنید که این برنامه به ازای این جایگشت خروجی نادرست می‌دهد.

ورودی🔗

در تنها سطر ورودی عدد صحیح و مثبت nn داده می‌شود. 3n1003 \leq n \leq 100

خروجی🔗

در تنها سطر خروجی یک جایگشت از اعداد 11 تا nn را چاپ کنید که این برنامه داده شده در سوال فوق خروجی نادرست می‌دهد.

اگر چند جواب برای مسئله وجود دارد می‌توانید هر کدام که می‌خواهید را چاپ کنید.

مثال🔗

ورودی نمونه ۱🔗

3
Plain text

خروجی نمونه ۱🔗

3 2 1
Plain text

خروجی برنامه‌های بالا به ازای این ورودی 2 1 3 است که صعودی مرتب نشده است.

ورودی نمونه ۲🔗

5
Plain text

خروجی نمونه ۲🔗

3 4 2 5 1
Plain text

خروجی برنامه‌های بالا به ازای این ورودی 3 2 1 4 5 است که صعودی مرتب نشده است.

دیباگ توانمند


  • محدودیت زمان: ۱ ثانیه
  • محدودیت حافظه: ۲۵۶ مگابایت

حامد صفری برنامه زیر را برای محاسبه aba^b به پیمانه cc پیاده سازی کرده است. اما این برنامه مشکل دارد که باعث می‌شود خروجی آن همواره درست نباشد.

توضیح تصویر

برنامه‌های زیر همگی یکسان هستند و صرفا به زبان‌های مختلف ترجمه شده است.

کد پایتون
def power(a, b, c):
    if b == 0:
        return 1
    ret = power(a, b // 2, c)
    ret *= ret
    if b % 2 == 1:
        ret *= a
    return ret % c

a, b, c = map(int, input().split())
a %= c
b %= c
print(power(a, b, c))
Python
کد سی‌پلاس‌پلاس
#include <iostream>

using namespace std;

int power(int a,int b,int c)
{
    if (b == 0)
        return 1;
    int ret = power(a, b / 2, c);
    ret *= ret;
    if (b % 2 == 1)
        ret *= a;
    return ret % c;
}

int main()
{
    int a, b, c;
    cin >> a >> b >> c;
    a %= c;
    b %= c;
    cout << power(a, b, c) << endl;
    return 0;
}
C++
کد جاوا
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int a = sc.nextInt(), b = sc.nextInt(), c = sc.nextInt();
        a %= c;
        b %= c;
        System.out.println(power(a, b, c));
    }

    public static int power(int a,int b,int c) {
        if (b == 0)
            return 1;
        int ret = power(a, b / 2, c);
        ret *= ret;
        if (b % 2 == 1)
            ret *= a;
        return ret % c; 
    }
}
Java

از شما می‌خواهیم با دریافت cc دو عدد صحیح aa و bb را چاپ کنید که خروجی این برنامه به ازای این سه ورودی درست نباشد.

ورودی🔗

در تنها سطر ورودی عدد صحیح و مثبت cc داده می‌شود. 2c1002 \leq c \leq 100

خروجی🔗

در تنها سطر خروجی دو عدد صحیح aa و bb چاپ کنید که خروجی این برنامه به ازای این ورودی درست نباشد.

1a,b10001 \leq a, b \leq 1000

اگر چند جواب برای این مسئله وجود دارد هر کدام را که می‌خواهید به دلخواه چاپ کنید.

مثال🔗

ورودی نمونه ۱🔗

3
Plain text

خروجی نمونه ۱🔗

2 10
Plain text

باقی‌مانده 210=10242^{10} = 1024 بر 33 برابر 11 است ولی خروجی برنامه بالا 22 خواهد بود.

ورودی نمونه ۲🔗

5
Plain text

خروجی نمونه ۲🔗

2 10
Plain text

باقی‌مانده 210=10242^{10} = 1024 بر 55 برابر 44 است ولی خروجی برنامه بالا 11 خواهد بود.

دیباگ خردکردن


  • محدودیت زمان: ۱ ثانیه
  • محدودیت حافظه: ۶۴ مگابایت

منظور از «خردکردن» nn تومان با سکه‌های c1,c2,,cmc_1, c_2, \dots, c_m \, تومانی این است که بتوان از هر کدام از این سکه‌ها تعدادی نامنفی برداریم به طوری که مجموع ارزش آن‌ها دقیقا برابر nn شود.

به صورت رسمی‌تر؛ اعداد صحیح و نامنفی مانند x1,x2,,xnx_1, x_2, \dots, x_n وجود داشته باشند به طوری که c1x1+c2x2++cmxm=nc_1 x_1 + c_2 x_2 + \dots + c_m x_m = n

توضیح تصویر

پیمان نجفی برنامه زیر را برای بررسی اینکه آیا می‌توان nn تومان را با استفاده از سکه‌های c1,c2,,cmc_1, c_2, \dots, c_m \, تومانی خرد کرد یا نه، طراحی کرده است. اما به دلیل فشار روزه، برنامه زیر نوشته شده که ایراد دارد.

برنامه‌های زیر همگی یکسان هستند و صرفا به زبان‌های مختلف ترجمه شده است.

کد پایتون
n, m = map(int, input().split())
c = list(map(int, input().split()))

for i in range(m):
    if n % c[i] == 0:
        print('YES')
        break
else:
    print('NO')
Python
کد سی‌پلاس‌پلاس
#include <iostream>

using namespace std;

int main()
{
    int n, m;
    cin >> n >> m;
    int c[m];
    for (int i = 0; i < m; i++)
        cin >> c[i];

    for (int i = 0; i < m; i++)
    {
        if (n % c[i] == 0)
        {
            cout << "YES\n";
            return 0;
        }
    }
    cout << "NO\n";
    return 0;
}
C++
کد جاوا
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt(), m = sc.nextInt();
        int[] c = int[m];
        for (int i = 0; i < m; i++)
            c[i] = sc.nextInt();

        for (int i = 0; i < m; i++)
            if (n % c[i] == 0) {
                System.out.println("YES");
                return;
            }
        System.out.println("NO");
        return; 
    }
}
Java

از شما می‌خواهیم برنامه‌ای بنویسید که با دریافت nn، mm عدد صحیح و مثبت و متمایز c1,c2,,cmc_1, c_2, \dots, c_m \, را چنان معرفی کند که راه حل بالا خروجی درستی به ازای این ورودی نداشته باشد.

ورودی🔗

در تنها سطر ورودی دو عدد صحیح و مثبت nn و mm که با فاصله از هم جدا شده‌اند، آمده است. 1mn1001 \leq m \leq n \leq 100

خروجی🔗

در تنها سطر خروجی mm عدد صحیح و متمایز مثبت c1,c2,,cmc_1, c_2, \dots, c_m را چاپ کنید. 1cin1 \leq c_i \leq n

اگر چند پاسخ برای مسئله وجود دارد یکی را به دلخواه چاپ کنید.

اگر هیچ پاسخی برای مسئله وجود ندارد؛ تنها در یک سطر -1 چاپ کنید.

مثال🔗

ورودی نمونه ۱🔗

5 3
Plain text

خروجی نمونه ۱🔗

2 3 4
Plain text

خروجی برنامه بالا به ازای این ورودی NO خواهد بود؛ چون هیچ‌کدام از سکه‌ها به تنهایی نمی‌تواند 55 را تولید کند اما اگر از ۱ سکه 22 و ۱ سکه 33 استفاده کنیم؛ می‌توانیم مقدار 55 را تولید کنیم.

ورودی نمونه ۲🔗

5 4
Plain text

خروجی نمونه ۲🔗

-1
Plain text

هر طور که چهار سکه مختلف از 11 تا 55 برداریم، لزوما یکی از سکه‌های 11 یا 55 را برداشته‌ایم. بنابراین همواره می‌توان مقدار 55 را تولید کرد و برنامه بالا نیز این مورد را تشخیص می‌دهد.

دیباگ درهم‌سازی


  • محدودیت زمان: ۱ ثانیه
  • محدودیت حافظه: ۲۵۶ مگابایت

الگوریتم‌هایی وجود دارند که با استفاده از آن‌ها می‌توان رشته‌ها را به عدد تبدیل کرد. (چون کار کردن با آن‌ها راحت و سریع است.)

اگر فرض کنیم رشته داده شده تنها از حروف کوچک انگلیسی تشکیل شده است. ارزش هر حرف انگلیسی را برابر تعداد حروفی در نظر بگیرید که در الفبای انگلیسی از آن‌ها کوچک‌تر است.

برای مثال اگر این ارزش‌گذاری را با ff نشان‌دهیم؛ مقدار f(a)=0f(a) = 0 و مقدار f(z)=25f(z) = 25 خواهد بود.

حال برای تبدیل رشته nn حرفی s=s0s1sn1s=s_0 s_1 \dots s_{n - 1} \, به عدد به صورت زیر عمل می‌کنیم. ابتدا دو عدد صحیح و مثبت و ثابت mm و bb را در نظر می‌گیریم. سپس عدد متناظر رشته ss که با hash(s)hash(s) نمایش داده می‌شود برابر است با:

hash(s)=f(s0).bn1+f(s1).bn2++f(sn2).b+f(sn1)modmhash(s) = f(s_0) . b^{n - 1} + f(s_1) . b^{n - 2} + \dots + f(s_{n - 2}) . b + f(s_{n - 1}) \mod m

اما متاسفانه این تبدیل یک به یک نیست. یعنی ممکن است دو رشته متفاوت به یک عدد تبدیل شوند و این اتفاق خوبی نیست.

توضیح تصویر

محمدحسین باقری رشته‌ها را با الگوریتم بالا به عدد تبدیل می‌کند و ادعا می‌کند که همواره رشته‌های مختلف به اعداد مختلف تبدیل می‌شوند. اما به دلیل فشار روزه، اشتباه می‌کند.

برنامه‌های زیر همگی یکسان هستند و صرفا به زبان‌های مختلف ترجمه شده است.

کد پایتون
def hash(st, b, m):
    ret = 0
    for i in range(len(st)):
        ret = (ret * b + (ord(st[i]) - ord('a'))) % m
    return ret

n = int(input())
b = int(input())
m = int(input())

s = input()
t = input()

if hash(s, b, m) == hash(t, b, m):
    print('YES')
else:
    print('NO')
Python
کد سی‌پلاس‌پلاس
#include <iostream>
#include <string>

using namespace std;

int hsh(string st, int b, int m)
{
    int ret = 0;
    for (int i = 0; i < (int)st.size(); i++)
        ret = (1LL * ret * b + (st[i] - 'a')) % m;
    return ret;
}

int main()
{

    int n, b, m;
    cin >> n >> b >> m;

    string s, t;
    cin >> s >> t;

    if (hsh(s, b, m) == hsh(t, b, m))
        cout << "YES\n";
    else
        cout << "NO\n";

    return 0;
}
C++
کد جاوا
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt(), b = sc.nextInt(), m = sc.nextInt();
        String s = sc.next(), t = sc.next();

    if (hash(s, b, m) == hash(t, b, m))
            System.out.println("YES");
        else
            System.out.println("NO");
    }
    public static int hash(String st, int b,int m) {
        long ret = 0;
        for (int i = 0; i < st.length(); i++)
            ret = ((long)ret * (long)b + ((long)st.charAt(i) - (long)'a')) % (long)m;
        return (int)ret;
    }
}
Java

از شما می‌خواهیم با ورودی گرفتن nn، bb و mm دو رشته متفاوت به طول nn به جای ss و tt که از حروف کوچک انگلیسی تشکیل شده‌اند، چاپ کنید؛ که برنامه‌‌ی بالا به اشتباه، آن‌ها را برابر درنظر بگیرد.

ورودی🔗

در تنها سطر ورودی سه عدد صحیح nn، bb و mm به ترتیب ظاهر می‌شوند.

10n10010 \leq n \leq 100 1b1001 \leq b \leq 100 1m1091\leq m \leq 10^9

خروجی🔗

خروجی شامل دو سطر است:

  • سطر اول خروجی، رشته ss که شامل nn حرف کوچک انگلیسی است.
  • سطر دوم خروجی، رشته tt که شامل nn حرف کوچک انگلیسی است.

اگر چند جواب مختلف برای این مسئله وجود دارد یک جواب درست را به دلخواه چاپ کنید.

با توجه به محدودیت‌های سوال، می‌توان ثابت کرد که همواره حداقل یک جواب برای این مسئله وجود دارد.

مثال🔗

ورودی نمونه ۱🔗

10 26 2
Plain text

خروجی نمونه ۱🔗

queraquera
teamsteams
Plain text

ورودی نمونه ۲🔗

10 2 13
Plain text

خروجی نمونه ۲🔗

mzmzmzmzmz
zmzmzmzmzm
Plain text